[{"data":1,"prerenderedAt":1053},["ShallowReactive",2],{"navigation_docs":3,"-docs-intelligence-embedder":356,"-docs-intelligence-embedder-surround":1048},[4,8,34,64,90,139,157,171,193,227,241,266,312,334],{"title":5,"path":6,"stem":7},"Documentation","\u002Fdocs","docs\u002Findex",{"title":9,"path":10,"stem":11,"children":12},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started\u002Findex",[13,14,18,22,26,30],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F01.getting-started\u002F01.introduction",{"title":19,"path":20,"stem":21},"Concepts","\u002Fdocs\u002Fgetting-started\u002Fconcepts","docs\u002F01.getting-started\u002F02.concepts",{"title":23,"path":24,"stem":25},"Quickstart (5 minutes)","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F01.getting-started\u002F03.quickstart",{"title":27,"path":28,"stem":29},"Local development","\u002Fdocs\u002Fgetting-started\u002Flocal-development","docs\u002F01.getting-started\u002F04.local-development",{"title":31,"path":32,"stem":33},"FAQ","\u002Fdocs\u002Fgetting-started\u002Ffaq","docs\u002F01.getting-started\u002F05.faq",{"title":35,"path":36,"stem":37,"children":38},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002F02.architecture\u002Findex",[39,40,44,48,52,56,60],{"title":35,"path":36,"stem":37},{"title":41,"path":42,"stem":43},"Architecture overview","\u002Fdocs\u002Farchitecture\u002Foverview","docs\u002F02.architecture\u002F01.overview",{"title":45,"path":46,"stem":47},"Services","\u002Fdocs\u002Farchitecture\u002Fservices","docs\u002F02.architecture\u002F02.services",{"title":49,"path":50,"stem":51},"Request lifecycle","\u002Fdocs\u002Farchitecture\u002Frequest-lifecycle","docs\u002F02.architecture\u002F03.request-lifecycle",{"title":53,"path":54,"stem":55},"Data model","\u002Fdocs\u002Farchitecture\u002Fdata-model","docs\u002F02.architecture\u002F04.data-model",{"title":57,"path":58,"stem":59},"Status and evidence","\u002Fdocs\u002Farchitecture\u002Fstatus-and-evidence","docs\u002F02.architecture\u002F05.status-and-evidence",{"title":61,"path":62,"stem":63},"Target architecture and authority","\u002Fdocs\u002Farchitecture\u002Ftarget-architecture","docs\u002F02.architecture\u002F06.target-architecture",{"title":65,"path":66,"stem":67,"children":68},"Auth","\u002Fdocs\u002Fauth","docs\u002F03.auth\u002Findex",[69,70,74,78,82,86],{"title":65,"path":66,"stem":67},{"title":71,"path":72,"stem":73},"Overview","\u002Fdocs\u002Fauth\u002Foverview","docs\u002F03.auth\u002F01.overview",{"title":75,"path":76,"stem":77},"Organization and agent model","\u002Fdocs\u002Fauth\u002Forg-project-model","docs\u002F03.auth\u002F02.org-project-model",{"title":79,"path":80,"stem":81},"Issuing API keys","\u002Fdocs\u002Fauth\u002Fissuing-api-keys","docs\u002F03.auth\u002F03.issuing-api-keys",{"title":83,"path":84,"stem":85},"Multi-tenant RLS","\u002Fdocs\u002Fauth\u002Fmulti-tenant-rls","docs\u002F03.auth\u002F04.multi-tenant-rls",{"title":87,"path":88,"stem":89},"Operator sessions and step-up","\u002Fdocs\u002Fauth\u002Foperator-sessions","docs\u002F03.auth\u002F05.operator-sessions",{"title":91,"path":92,"stem":93,"children":94},"Proxy","\u002Fdocs\u002Fproxy","docs\u002F04.proxy\u002Findex",[95,96,99,103,107,111,115,119,123,127,131,135],{"title":91,"path":92,"stem":93},{"title":71,"path":97,"stem":98},"\u002Fdocs\u002Fproxy\u002Foverview","docs\u002F04.proxy\u002F01.overview",{"title":100,"path":101,"stem":102},"Authentication","\u002Fdocs\u002Fproxy\u002Fauthentication","docs\u002F04.proxy\u002F02.authentication",{"title":104,"path":105,"stem":106},"Request routing","\u002Fdocs\u002Fproxy\u002Frequest-routing","docs\u002F04.proxy\u002F03.request-routing",{"title":108,"path":109,"stem":110},"Sessions","\u002Fdocs\u002Fproxy\u002Fsessions","docs\u002F04.proxy\u002F04.sessions",{"title":112,"path":113,"stem":114},"Directives","\u002Fdocs\u002Fproxy\u002Fdirectives","docs\u002F04.proxy\u002F05.directives",{"title":116,"path":117,"stem":118},"Idempotency and budgets","\u002Fdocs\u002Fproxy\u002Fidempotency-and-budgets","docs\u002F04.proxy\u002F06.idempotency-and-budgets",{"title":120,"path":121,"stem":122},"Rate limiting","\u002Fdocs\u002Fproxy\u002Frate-limiting","docs\u002F04.proxy\u002F07.rate-limiting",{"title":124,"path":125,"stem":126},"Provider adapters","\u002Fdocs\u002Fproxy\u002Fprovider-adapters","docs\u002F04.proxy\u002F08.provider-adapters",{"title":128,"path":129,"stem":130},"Auth caching","\u002Fdocs\u002Fproxy\u002Fauth-caching","docs\u002F04.proxy\u002F09.auth-caching",{"title":132,"path":133,"stem":134},"Configuration","\u002Fdocs\u002Fproxy\u002Fconfiguration","docs\u002F04.proxy\u002F10.configuration",{"title":136,"path":137,"stem":138},"Provider routing and resilience","\u002Fdocs\u002Fproxy\u002Fprovider-routing-and-resilience","docs\u002F04.proxy\u002F11.provider-routing-and-resilience",{"title":140,"path":141,"stem":142,"children":143},"Memory","\u002Fdocs\u002Fmemory","docs\u002F05.memory\u002Findex",[144,145,149,153],{"title":140,"path":141,"stem":142},{"title":146,"path":147,"stem":148},"Memory overview","\u002Fdocs\u002Fmemory\u002Foverview","docs\u002F05.memory\u002F01.overview",{"title":150,"path":151,"stem":152},"Write path","\u002Fdocs\u002Fmemory\u002Fwrite-path","docs\u002F05.memory\u002F02.write-path",{"title":154,"path":155,"stem":156},"Search and lifecycle","\u002Fdocs\u002Fmemory\u002Fsearch-and-lifecycle","docs\u002F05.memory\u002F03.search-and-lifecycle",{"title":158,"path":159,"stem":160,"children":161},"Context","\u002Fdocs\u002Fcontext","docs\u002F06.context\u002Findex",[162,163,167],{"title":158,"path":159,"stem":160},{"title":164,"path":165,"stem":166},"Assembly pipeline","\u002Fdocs\u002Fcontext\u002Foverview","docs\u002F06.context\u002F01.overview",{"title":168,"path":169,"stem":170},"Ranking and packing","\u002Fdocs\u002Fcontext\u002Franking-and-packing","docs\u002F06.context\u002F02.ranking-and-packing",{"title":172,"path":173,"stem":174,"children":175},"Intelligence","\u002Fdocs\u002Fintelligence","docs\u002F07.intelligence\u002Findex",[176,177,181,185,189],{"title":172,"path":173,"stem":174},{"title":178,"path":179,"stem":180},"Workers","\u002Fdocs\u002Fintelligence\u002Fworkers","docs\u002F07.intelligence\u002F01.workers",{"title":182,"path":183,"stem":184},"Extraction","\u002Fdocs\u002Fintelligence\u002Fextraction","docs\u002F07.intelligence\u002F02.extraction",{"title":186,"path":187,"stem":188},"Embedder","\u002Fdocs\u002Fintelligence\u002Fembedder","docs\u002F07.intelligence\u002F03.embedder",{"title":190,"path":191,"stem":192},"Extraction evaluation","\u002Fdocs\u002Fintelligence\u002Fevaluation","docs\u002F07.intelligence\u002F04.evaluation",{"title":194,"path":195,"stem":196,"children":197},"API reference","\u002Fdocs\u002Fapi-reference","docs\u002F08.api-reference\u002Findex",[198,199,203,207,211,215,219,223],{"title":194,"path":195,"stem":196},{"title":200,"path":201,"stem":202},"Chat completions","\u002Fdocs\u002Fapi-reference\u002Fchat-completions","docs\u002F08.api-reference\u002F01.chat-completions",{"title":204,"path":205,"stem":206},"Responses","\u002Fdocs\u002Fapi-reference\u002Fresponses","docs\u002F08.api-reference\u002F02.responses",{"title":208,"path":209,"stem":210},"Errors","\u002Fdocs\u002Fapi-reference\u002Ferrors","docs\u002F08.api-reference\u002F03.errors",{"title":212,"path":213,"stem":214},"Health and metrics","\u002Fdocs\u002Fapi-reference\u002Fproxy-health","docs\u002F08.api-reference\u002F04.proxy-health",{"title":216,"path":217,"stem":218},"HTTP route inventory","\u002Fdocs\u002Fapi-reference\u002Fhttp-routes","docs\u002F08.api-reference\u002F05.http-routes",{"title":220,"path":221,"stem":222},"Management API","\u002Fdocs\u002Fapi-reference\u002Fmanagement-api","docs\u002F08.api-reference\u002F06.management-api",{"title":224,"path":225,"stem":226},"Auth gRPC (ValidateToken, ValidateAgent)","\u002Fdocs\u002Fapi-reference\u002Fauth-grpc","docs\u002F08.api-reference\u002F07.auth-grpc",{"title":228,"path":229,"stem":230,"children":231},"MCP","\u002Fdocs\u002Fmcp","docs\u002F09.mcp\u002Findex",[232,233,237],{"title":228,"path":229,"stem":230},{"title":234,"path":235,"stem":236},"Memory server","\u002Fdocs\u002Fmcp\u002Fmemory-server","docs\u002F09.mcp\u002F01.memory-server",{"title":238,"path":239,"stem":240},"Operator gateway","\u002Fdocs\u002Fmcp\u002Foperator-gateway","docs\u002F09.mcp\u002F02.operator-gateway",{"title":242,"path":243,"stem":244,"children":245},"Security","\u002Fdocs\u002Fsecurity","docs\u002F10.security\u002Findex",[246,247,251,254,258,262],{"title":242,"path":243,"stem":244},{"title":248,"path":249,"stem":250},"Security overview","\u002Fdocs\u002Fsecurity\u002Foverview","docs\u002F10.security\u002F01.overview",{"title":100,"path":252,"stem":253},"\u002Fdocs\u002Fsecurity\u002Fauthentication","docs\u002F10.security\u002F02.authentication",{"title":255,"path":256,"stem":257},"Tenant isolation","\u002Fdocs\u002Fsecurity\u002Ftenant-isolation","docs\u002F10.security\u002F03.tenant-isolation",{"title":259,"path":260,"stem":261},"Secrets and keys","\u002Fdocs\u002Fsecurity\u002Fsecrets-and-keys","docs\u002F10.security\u002F04.secrets-and-keys",{"title":263,"path":264,"stem":265},"Prompt injection","\u002Fdocs\u002Fsecurity\u002Fprompt-injection","docs\u002F10.security\u002F05.prompt-injection",{"title":267,"path":268,"stem":269,"children":270},"Operations","\u002Fdocs\u002Foperations","docs\u002F11.operations\u002Findex",[271,272,276,280,284,288,292,296,300,304,308],{"title":267,"path":268,"stem":269},{"title":273,"path":274,"stem":275},"Observability","\u002Fdocs\u002Foperations\u002Fobservability","docs\u002F11.operations\u002F01.observability",{"title":277,"path":278,"stem":279},"Traces and ClickHouse","\u002Fdocs\u002Foperations\u002Ftraces-and-clickhouse","docs\u002F11.operations\u002F02.traces-and-clickhouse",{"title":281,"path":282,"stem":283},"Health checks","\u002Fdocs\u002Foperations\u002Fhealth-checks","docs\u002F11.operations\u002F03.health-checks",{"title":285,"path":286,"stem":287},"Incident response","\u002Fdocs\u002Foperations\u002Fincident-response","docs\u002F11.operations\u002F04.incident-response",{"title":289,"path":290,"stem":291},"Troubleshooting","\u002Fdocs\u002Foperations\u002Ftroubleshooting","docs\u002F11.operations\u002F05.troubleshooting",{"title":293,"path":294,"stem":295},"Billing and budgets","\u002Fdocs\u002Foperations\u002Fbilling-and-budgets","docs\u002F11.operations\u002F06.billing-and-budgets",{"title":297,"path":298,"stem":299},"Evidence and relay","\u002Fdocs\u002Foperations\u002Fevidence-and-relay","docs\u002F11.operations\u002F07.evidence-and-relay",{"title":301,"path":302,"stem":303},"Console","\u002Fdocs\u002Foperations\u002Fconsole","docs\u002F11.operations\u002F08.console",{"title":305,"path":306,"stem":307},"Failure modes and recovery","\u002Fdocs\u002Foperations\u002Ffailure-and-recovery","docs\u002F11.operations\u002F09.failure-and-recovery",{"title":309,"path":310,"stem":311},"Data lifecycle and deletion","\u002Fdocs\u002Foperations\u002Fdata-lifecycle-and-deletion","docs\u002F11.operations\u002F10.data-lifecycle-and-deletion",{"title":313,"path":314,"stem":315,"children":316},"Deployment","\u002Fdocs\u002Fdeployment","docs\u002F12.deployment\u002Findex",[317,318,322,326,330],{"title":313,"path":314,"stem":315},{"title":319,"path":320,"stem":321},"Docker Compose (dev)","\u002Fdocs\u002Fdeployment\u002Fdocker-compose","docs\u002F12.deployment\u002F01.docker-compose",{"title":323,"path":324,"stem":325},"Environment variables","\u002Fdocs\u002Fdeployment\u002Fenvironment-variables","docs\u002F12.deployment\u002F02.environment-variables",{"title":327,"path":328,"stem":329},"Kubernetes","\u002Fdocs\u002Fdeployment\u002Fkubernetes","docs\u002F12.deployment\u002F03.kubernetes",{"title":331,"path":332,"stem":333},"Production readiness","\u002Fdocs\u002Fdeployment\u002Fproduction-readiness","docs\u002F12.deployment\u002F04.production-readiness",{"title":335,"path":336,"stem":337,"children":338},"Reference","\u002Fdocs\u002Freference","docs\u002F13.reference\u002Findex",[339,340,344,348,352],{"title":335,"path":336,"stem":337},{"title":341,"path":342,"stem":343},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","docs\u002F13.reference\u002F01.glossary",{"title":345,"path":346,"stem":347},"Roadmap and gates","\u002Fdocs\u002Freference\u002Froadmap","docs\u002F13.reference\u002F02.roadmap",{"title":349,"path":350,"stem":351},"Architecture decisions","\u002Fdocs\u002Freference\u002Fadr","docs\u002F13.reference\u002F03.adr",{"title":353,"path":354,"stem":355},"Compatibility and versioning","\u002Fdocs\u002Freference\u002Fcompatibility","docs\u002F13.reference\u002F04.compatibility",{"id":357,"title":186,"audience":358,"author":359,"authorUrl":359,"body":360,"coverIndex":359,"coverLabel":359,"coverTone":359,"date":359,"decisionStatus":359,"description":1039,"excerpt":359,"extension":1040,"featured":1041,"historical":1041,"meta":1042,"navigation":1043,"path":187,"readingTime":359,"scope":1044,"seo":1045,"sourceOfTruth":1046,"status":371,"stem":188,"tags":359,"verifiedDate":372,"__hash__":1047},"docs\u002Fdocs\u002F07.intelligence\u002F03.embedder.md","operator",null,{"type":361,"value":362,"toc":1026},"minimark",[363,367,373,378,471,474,479,534,545,549,561,624,628,638,673,676,679,846,850,853,863,866,869,873,890,894,965,972,976,993,997,1022],[364,365,366],"p",{},"The embedder owns the embedding contract, profile registry, geometry validation, and backend selection. The CPU stub, TEI, and hosted backends are implemented. Readiness depends on the selected profile's external service and credentials.",[368,369],"page-status",{"note":370,"status":371,"verified":372},"Backend and geometry contracts are local; embedding quality and hosted availability are separate claims","IMPLEMENTED","2026-10-21",[374,375,377],"h2",{"id":376},"profiles-and-geometry","Profiles and geometry",[379,380,381,403],"table",{},[382,383,384],"thead",{},[385,386,387,391,394,397,400],"tr",{},[388,389,390],"th",{},"Profile",[388,392,393],{},"Default model",[388,395,396],{},"Default dimension",[388,398,399],{},"Backend",[388,401,402],{},"What readiness proves",[404,405,406,429,450],"tbody",{},[385,407,408,415,420,423,426],{},[409,410,411],"td",{},[412,413,414],"code",{},"cpu",[409,416,417],{},[412,418,419],{},"all-MiniLM-L6-v2",[409,421,422],{},"384",[409,424,425],{},"Deterministic stub",[409,427,428],{},"Contract plumbing only",[385,430,431,436,441,444,447],{},[409,432,433],{},[412,434,435],{},"gpu",[409,437,438],{},[412,439,440],{},"BAAI\u002Fbge-m3",[409,442,443],{},"1024",[409,445,446],{},"TEI HTTP",[409,448,449],{},"TEI health, model ID, and observed dimensions",[385,451,452,457,462,465,468],{},[409,453,454],{},[412,455,456],{},"hosted",[409,458,459],{},[412,460,461],{},"text-embedding-3-large",[409,463,464],{},"3072",[409,466,467],{},"OpenAI or Cohere API",[409,469,470],{},"Credentials and a successful probe at the configured dimension",[364,472,473],{},"A profile name is not a quality claim. The CPU stub is deterministic and useful for tests; it is not a semantic model.",[475,476,478],"h3",{"id":477},"hosted-geometry","Hosted geometry",[379,480,481,491],{},[382,482,483],{},[385,484,485,488],{},[388,486,487],{},"Provider",[388,489,490],{},"Models and dimensions",[404,492,493,511,526],{},[385,494,495,498],{},[409,496,497],{},"OpenAI",[409,499,500,502,503,506,507,510],{},[412,501,461],{}," 1–3072 via Matryoshka; ",[412,504,505],{},"text-embedding-3-small"," 1–1536; ",[412,508,509],{},"text-embedding-ada-002"," fixed 1536",[385,512,513,516],{},[409,514,515],{},"Cohere",[409,517,518,521,522,525],{},[412,519,520],{},"embed-english-v3.0"," and ",[412,523,524],{},"embed-multilingual-v3.0"," fixed 1024; light variants fixed 384",[385,527,528,531],{},[409,529,530],{},"Voyage",[409,532,533],{},"Accepted in settings but fail-closed; no client is implemented",[364,535,536,537,540,541,544],{},"Base URLs must use HTTPS and must not contain userinfo. The hosted API key is a secret and is never logged. The canonical key variable is ",[412,538,539],{},"IBEX_EMBEDDING_HOSTED_API_KEY","; the OpenAI-only ",[412,542,543],{},"OPENAI_EMBEDDING_API_KEY"," is a migration alias.",[374,546,548],{"id":547},"selection-and-fallback","Selection and fallback",[364,550,551,554,555,557,558,560],{},[412,552,553],{},"app\u002Ffactory.py"," maps the profile to exactly one backend. There is deliberately no silent fallback from ",[412,556,435],{}," or ",[412,559,456],{}," to the stub: that would produce wrong-geometry vectors and corrupt the index.",[379,562,563,573],{},[382,564,565],{},[385,566,567,570],{},[388,568,569],{},"Misconfiguration",[388,571,572],{},"Result",[404,574,575,583,596,607,617],{},[385,576,577,580],{},[409,578,579],{},"Unknown profile",[409,581,582],{},"Startup validation failure",[385,584,585,590],{},[409,586,587,589],{},[412,588,435],{}," without TEI base URL",[409,591,592,595],{},[412,593,594],{},"BackendUnavailableError","; not ready",[385,597,598,603],{},[409,599,600,602],{},[412,601,456],{}," without API key",[409,604,605,595],{},[412,606,594],{},[385,608,609,614],{},[409,610,611,613],{},[412,612,456],{}," with Voyage",[409,615,616],{},"Fail closed; unsupported client",[385,618,619,622],{},[409,620,621],{},"Cache enabled without Redis URL",[409,623,582],{},[374,625,627],{"id":626},"readiness-is-an-active-probe","Readiness is an active probe",[364,629,630,633,634,637],{},[412,631,632],{},"GET \u002Fhealth"," is liveness. ",[412,635,636],{},"GET \u002Fready"," is only true after startup checks complete:",[639,640,641,661,667],"ul",{},[642,643,644,648,649,652,653,656,657,660],"li",{},[645,646,647],"strong",{},"TEI:"," poll ",[412,650,651],{},"\u002Fhealth"," within ",[412,654,655],{},"IBEX_EMBEDDING_TEI_HEALTH_TIMEOUT_SECONDS","; require a model ID from ",[412,658,659],{},"\u002Finfo","; reject a reported dimension mismatch; then run one bounded embed probe and require the configured dimension.",[642,662,663,666],{},[645,664,665],{},"Hosted:"," run one bounded embed probe and require the configured dimension. A mismatch is reported as a geometry failure, not a generic vector error.",[642,668,669,672],{},[645,670,671],{},"Cache:"," ping Redis when caching is enabled.",[364,674,675],{},"Dimension mismatch is a startup\u002Freadiness failure, never a silent truncation. Never write a vector whose dimension does not match the index.",[374,677,132],{"id":678},"configuration",[379,680,681,691],{},[382,682,683],{},[385,684,685,688],{},[388,686,687],{},"Variable",[388,689,690],{},"Meaning",[404,692,693,713,723,733,745,755,765,781,791,800,810,820,833],{},[385,694,695,700],{},[409,696,697],{},[412,698,699],{},"IBEX_EMBEDDING_PROFILE",[409,701,702,704,705,707,708,710,711],{},[412,703,414],{},", ",[412,706,435],{},", or ",[412,709,456],{},"; default ",[412,712,414],{},[385,714,715,720],{},[409,716,717],{},[412,718,719],{},"IBEX_EMBEDDING_DIM",[409,721,722],{},"Expected vector dimension; profile default when unset",[385,724,725,730],{},[409,726,727],{},[412,728,729],{},"IBEX_EMBEDDING_MODEL",[409,731,732],{},"Model identifier; profile default when unset",[385,734,735,740],{},[409,736,737],{},[412,738,739],{},"IBEX_EMBEDDING_TEI_BASE_URL",[409,741,742,743],{},"TEI origin for ",[412,744,435],{},[385,746,747,752],{},[409,748,749],{},[412,750,751],{},"IBEX_EMBEDDING_TEI_ALLOW_INSECURE",[409,753,754],{},"Development-only cleartext escape hatch",[385,756,757,762],{},[409,758,759],{},[412,760,761],{},"IBEX_EMBEDDING_TEI_API_KEY",[409,763,764],{},"Optional TEI bearer token; forbidden with insecure HTTP",[385,766,767,772],{},[409,768,769],{},[412,770,771],{},"IBEX_EMBEDDING_HOSTED_PROVIDER",[409,773,774,557,777,780],{},[412,775,776],{},"openai",[412,778,779],{},"cohere"," (Voyage fails closed)",[385,782,783,788],{},[409,784,785],{},[412,786,787],{},"IBEX_EMBEDDING_HOSTED_BASE_URL",[409,789,790],{},"Optional HTTPS origin override",[385,792,793,797],{},[409,794,795],{},[412,796,539],{},[409,798,799],{},"Hosted secret; never log",[385,801,802,807],{},[409,803,804],{},[412,805,806],{},"IBEX_EMBEDDING_CACHE_ENABLED",[409,808,809],{},"Wrap the backend in the Redis cache",[385,811,812,817],{},[409,813,814],{},[412,815,816],{},"IBEX_EMBEDDING_CACHE_TTL_SECONDS",[409,818,819],{},"Cache TTL; default 86400",[385,821,822,827],{},[409,823,824],{},[412,825,826],{},"IBEX_EMBEDDING_CACHE_REDIS_URL",[409,828,829,830],{},"Cache Redis; falls back to ",[412,831,832],{},"REDIS_URL",[385,834,835,840],{},[409,836,837],{},[412,838,839],{},"IBEX_EMBEDDING_API_TOKEN",[409,841,842,843],{},"Internal bearer for ",[412,844,845],{},"POST \u002Fv1\u002Fembed",[374,847,849],{"id":848},"tenant-scoped-cache","Tenant-scoped cache",[364,851,852],{},"The optional cache is a content-addressed Redis decorator. Keys are:",[854,855,861],"pre",{"className":856,"code":858,"language":859,"meta":860},[857],"language-text","{org_id}:embed:v1:{sha256(length-prefixed model_id, dimensions, utf-8 text)}\n","text","",[412,862,858],{"__ignoreMap":860},[364,864,865],{},"The digest is over exact UTF-8 bytes; there is no Unicode normalization or case folding, because the provider inference input must match. The cache requires organization context from the request; without it the backend fails closed rather than using a global key.",[364,867,868],{},"Cache reads and writes fail open on Redis errors: the request falls through to the embedding backend instead of failing inference. Hits are validated for dimension and sentinel shape before use. Duplicate texts within a batch share one digest and one backend call.",[374,870,872],{"id":871},"operational-rules","Operational rules",[639,874,875,878,881,884,887],{},[642,876,877],{},"Changing model or dimension is an index migration, not a configuration tweak. Re-embed and verify the pgvector index before switching traffic.",[642,879,880],{},"Do not log texts, vectors, tokens, or API keys. Log backend, batch size, latency, and error class only.",[642,882,883],{},"A readiness probe that passes at startup does not prove the provider stays healthy; monitor backend errors and latency.",[642,885,886],{},"Keep embedder credentials server-side and out of Console\u002Fbrowser configuration.",[642,888,889],{},"A CPU profile is not an acceptable production embedding quality claim.",[374,891,893],{"id":892},"run-locally","Run locally",[854,895,899],{"className":896,"code":897,"language":898,"meta":860,"style":860},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","cd services\u002Fembedder\nuv sync --frozen --extra dev\nIBEX_EMBEDDING_PROFILE=cpu .venv\u002Fbin\u002Fuvicorn app.main:app --host 127.0.0.1 --port 8004\n","bash",[412,900,901,914,934],{"__ignoreMap":860},[902,903,906,910],"span",{"class":904,"line":905},"line",1,[902,907,909],{"class":908},"sJdAF","cd",[902,911,913],{"class":912},"sTbE_"," services\u002Fembedder\n",[902,915,917,921,924,928,931],{"class":904,"line":916},2,[902,918,920],{"class":919},"sYn-s","uv",[902,922,923],{"class":912}," sync",[902,925,927],{"class":926},"sz9Cv"," --frozen",[902,929,930],{"class":926}," --extra",[902,932,933],{"class":912}," dev\n",[902,935,937,940,944,946,949,952,955,959,962],{"class":904,"line":936},3,[902,938,699],{"class":939},"sSC40",[902,941,943],{"class":942},"soVBu","=",[902,945,414],{"class":912},[902,947,948],{"class":919}," .venv\u002Fbin\u002Fuvicorn",[902,950,951],{"class":912}," app.main:app",[902,953,954],{"class":926}," --host",[902,956,958],{"class":957},"s7CZa"," 127.0.0.1",[902,960,961],{"class":926}," --port",[902,963,964],{"class":957}," 8004\n",[364,966,967,968,971],{},"The compose and observability examples use port ",[412,969,970],{},"8004","; use the port you actually bind.",[374,973,975],{"id":974},"limits","Limits",[639,977,978,981,984,987,990],{},[642,979,980],{},"No hosted embedding quality benchmark is published.",[642,982,983],{},"TEI capacity and GPU scheduling are environment-specific.",[642,985,986],{},"The CPU stub does not model real semantic neighborhoods.",[642,988,989],{},"Cache fail-open means a Redis outage increases provider load rather than failing requests.",[642,991,992],{},"Voyage is not implemented.",[374,994,996],{"id":995},"related","Related",[639,998,999,1005,1011,1017],{},[642,1000,1001,1004],{},[1002,1003,182],"a",{"href":183}," — where embeddings enter the write path",[642,1006,1007,1010],{},[1002,1008,1009],{"href":151},"Memory writes"," — embedding and index persistence",[642,1012,1013,1016],{},[1002,1014,1015],{"href":155},"Memory search"," — vector retrieval behavior",[642,1018,1019,1021],{},[1002,1020,190],{"href":191}," — quality evidence boundaries",[1023,1024,1025],"style",{},"html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":860,"searchDepth":916,"depth":916,"links":1027},[1028,1031,1032,1033,1034,1035,1036,1037,1038],{"id":376,"depth":916,"text":377,"children":1029},[1030],{"id":477,"depth":936,"text":478},{"id":547,"depth":916,"text":548},{"id":626,"depth":916,"text":627},{"id":678,"depth":916,"text":132},{"id":848,"depth":916,"text":849},{"id":871,"depth":916,"text":872},{"id":892,"depth":916,"text":893},{"id":974,"depth":916,"text":975},{"id":995,"depth":916,"text":996},"Embedding profiles, backend geometry checks, tenant-scoped caching, and readiness boundaries.","md",false,{},true,"shipped-local",{"title":186,"description":1039},"services\u002Fembedder\u002FREADME.md; services\u002Fembedder\u002Fapp\u002Ffactory.py; services\u002Fembedder\u002Fapp\u002Fmain.py","qe_4twH7VkjY9cvHFomQhl7Ij8EI9q_ssbFTRGzRsz4",[1049,1051],{"title":182,"path":183,"stem":184,"description":1050,"children":-1},"Session-to-memory extraction, provider adapters, gold-set evaluation, and live vLLM limitations.",{"title":190,"path":191,"stem":192,"description":1052,"children":-1},"The versioned gold set, cassette replay, regression gate, and why a perfect score is not a quality claim.",1792875076463]