[{"data":1,"prerenderedAt":1975},["ShallowReactive",2],{"navigation_docs":3,"-sdks-openfeature-python":244,"-sdks-openfeature-python-surround":1968},[4,51,78,229],{"title":5,"icon":6,"modifiedAt":7,"path":8,"stem":9,"children":10,"page":6},"Getting Started",false,"2026-04-30T19:15:33.000Z","\u002Fgetting-started","1.getting-started",[11,16,21,26,31,36,41,46],{"title":12,"path":13,"stem":14,"icon":15},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":17,"path":18,"stem":19,"icon":20},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":22,"path":23,"stem":24,"icon":25},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":27,"path":28,"stem":29,"icon":30},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":32,"path":33,"stem":34,"icon":35},"JSON Schema Validation","\u002Fgetting-started\u002Fjson-schema-validation","1.getting-started\u002F5.json-schema-validation","i-lucide-braces",{"title":37,"path":38,"stem":39,"icon":40},"Testing Rules","\u002Fgetting-started\u002Ftesting-targeting-rules","1.getting-started\u002F6.testing-targeting-rules","i-lucide-flask-conical",{"title":42,"path":43,"stem":44,"icon":45},"Segments","\u002Fgetting-started\u002Fsegments","1.getting-started\u002F7.segments","i-lucide-squares-intersect",{"title":47,"path":48,"stem":49,"icon":50},"Pricing & Billing","\u002Fgetting-started\u002Fpricing-and-billing","1.getting-started\u002F8.pricing-and-billing","i-lucide-credit-card",{"title":52,"modifiedAt":53,"defaultOpen":54,"path":55,"stem":56,"children":57,"page":6},"Monitoring","2026-09-24T23:33:20.000Z",true,"\u002Fmonitoring","2.monitoring",[58,63,68,73],{"title":59,"path":60,"stem":61,"icon":62},"Activity","\u002Fmonitoring\u002Factivity","2.monitoring\u002F1.activity","i-lucide-activity",{"title":64,"path":65,"stem":66,"icon":67},"Lifecycle","\u002Fmonitoring\u002Flifecycle","2.monitoring\u002F2.lifecycle","i-lucide-recycle",{"title":69,"path":70,"stem":71,"icon":72},"Alerts","\u002Fmonitoring\u002Falerts","2.monitoring\u002F3.alerts","i-lucide-bell",{"title":74,"path":75,"stem":76,"icon":77},"Dynamic Detection","\u002Fmonitoring\u002Fdynamic-detection","2.monitoring\u002F4.dynamic-detection","i-lucide-hat-glasses",{"title":79,"modifiedAt":53,"defaultOpen":54,"path":80,"stem":81,"children":82,"page":6},"SDKs","\u002Fsdks","3.sdks",[83,88,109,134,150,181,224],{"title":84,"path":85,"stem":86,"icon":87},"Available SDKs","\u002Fsdks\u002Favailable-sdks","3.sdks\u002F1.available-sdks","i-lucide-list",{"title":89,"modifiedAt":53,"icon":90,"defaultOpen":6,"path":91,"stem":92,"children":93,"page":6},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","3.sdks\u002F2.browser",[94,99,104],{"title":95,"path":96,"stem":97,"icon":98},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","3.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":100,"path":101,"stem":102,"icon":103},"React","\u002Fsdks\u002Fbrowser\u002Freact","3.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":105,"path":106,"stem":107,"icon":108},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","3.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":110,"modifiedAt":53,"icon":111,"defaultOpen":6,"path":112,"stem":113,"children":114,"page":6},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","3.sdks\u002F3.mobile",[115,119,124,129],{"title":116,"path":117,"stem":118,"icon":103},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","3.sdks\u002F3.mobile\u002F1.react-native",{"title":120,"path":121,"stem":122,"icon":123},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","3.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":125,"path":126,"stem":127,"icon":128},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","3.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":130,"path":131,"stem":132,"icon":133},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","3.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":135,"modifiedAt":53,"icon":136,"defaultOpen":6,"path":137,"stem":138,"children":139,"page":6},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","3.sdks\u002F4.meta",[140,145],{"title":141,"path":142,"stem":143,"icon":144},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","3.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":146,"path":147,"stem":148,"icon":149},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","3.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":151,"modifiedAt":53,"icon":152,"defaultOpen":6,"path":153,"stem":154,"children":155,"page":6},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","3.sdks\u002F5.server",[156,161,166,171,176],{"title":157,"path":158,"stem":159,"icon":160},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","3.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":162,"path":163,"stem":164,"icon":165},"Python","\u002Fsdks\u002Fserver\u002Fpython","3.sdks\u002F5.server\u002F2.python","cd-logos-python",{"title":167,"path":168,"stem":169,"icon":170},"Java","\u002Fsdks\u002Fserver\u002Fjava","3.sdks\u002F5.server\u002F3.java","cd-logos-java",{"title":172,"path":173,"stem":174,"icon":175},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","3.sdks\u002F5.server\u002F4.dotnet","cd-logos-dotnet",{"title":177,"path":178,"stem":179,"icon":180},"Go","\u002Fsdks\u002Fserver\u002Fgo","3.sdks\u002F5.server\u002F5.go","cd-logos-go",{"title":182,"modifiedAt":53,"icon":183,"defaultOpen":6,"path":184,"stem":185,"children":186,"page":6},"OpenFeature Providers","cd-logos-openfeature","\u002Fsdks\u002Fopenfeature","3.sdks\u002F6.openfeature",[187,192,196,200,204,208,212,216,220],{"title":188,"path":189,"stem":190,"icon":183,"icons":191},"Web","\u002Fsdks\u002Fopenfeature\u002Fweb","3.sdks\u002F6.openfeature\u002F1.web",[183,98],{"title":125,"path":193,"stem":194,"icon":183,"icons":195},"\u002Fsdks\u002Fopenfeature\u002Fswift","3.sdks\u002F6.openfeature\u002F2.swift",[183,128],{"title":130,"path":197,"stem":198,"icon":183,"icons":199},"\u002Fsdks\u002Fopenfeature\u002Fandroid","3.sdks\u002F6.openfeature\u002F3.android",[183,133],{"title":120,"path":201,"stem":202,"icon":183,"icons":203},"\u002Fsdks\u002Fopenfeature\u002Fflutter","3.sdks\u002F6.openfeature\u002F4.flutter",[183,123],{"title":157,"path":205,"stem":206,"icon":183,"icons":207},"\u002Fsdks\u002Fopenfeature\u002Fnode-js","3.sdks\u002F6.openfeature\u002F5.node-js",[183,160],{"title":162,"path":209,"stem":210,"icon":183,"icons":211},"\u002Fsdks\u002Fopenfeature\u002Fpython","3.sdks\u002F6.openfeature\u002F6.python",[183,165],{"title":167,"path":213,"stem":214,"icon":183,"icons":215},"\u002Fsdks\u002Fopenfeature\u002Fjava","3.sdks\u002F6.openfeature\u002F7.java",[183,170],{"title":172,"path":217,"stem":218,"icon":183,"icons":219},"\u002Fsdks\u002Fopenfeature\u002Fdotnet","3.sdks\u002F6.openfeature\u002F8.dotnet",[183,175],{"title":177,"path":221,"stem":222,"icon":183,"icons":223},"\u002Fsdks\u002Fopenfeature\u002Fgo","3.sdks\u002F6.openfeature\u002F9.go",[183,180],{"title":225,"path":226,"stem":227,"icon":228},"Maven Repository","\u002Fsdks\u002Fmaven-repository","3.sdks\u002F7.maven-repository","i-lucide-package",{"title":230,"modifiedAt":53,"defaultOpen":54,"path":231,"stem":232,"children":233,"page":6},"Integrations","\u002Fintegrations","4.integrations",[234,239],{"title":235,"path":236,"stem":237,"icon":238},"Terraform","\u002Fintegrations\u002Fterraform","4.integrations\u002F1.terraform","cd-logos-terraform",{"title":240,"path":241,"stem":242,"icon":243},"MCP","\u002Fintegrations\u002Fmcp","4.integrations\u002F2.mcp","cd-logos-mcp",{"id":245,"title":246,"body":247,"description":1959,"extension":1960,"links":1961,"meta":1962,"navigation":1964,"path":209,"seo":1966,"stem":210,"__hash__":1967},"docs\u002F3.sdks\u002F6.openfeature\u002F6.python.md","OpenFeature Python Provider",{"type":248,"value":249,"toc":1945},"minimark",[250,254,260,265,282,289,292,296,302,309,337,341,358,455,459,468,485,490,493,500,606,630,634,637,690,694,697,773,776,837,850,908,915,919,926,1009,1016,1020,1023,1190,1193,1254,1259,1263,1270,1411,1421,1425,1432,1439,1788,1794,1923,1941],[251,252],"div",{"hidden":54,"dataTitleIcon":253},"openfeature-python",[255,256],"external-badges",{"package-url":257,"registry":258,"repo":259},"https:\u002F\u002Fpypi.org\u002Fproject\u002Fconfigdirector-openfeature-server-provider\u002F","pypi","python-server-sdk\u002Ftree\u002Fmain\u002Fconfigdirector-openfeature-server-provider",[261,262,264],"h2",{"id":263},"introduction","Introduction",[266,267,268,269,277,278,281],"p",{},"The OpenFeature Python Provider is intended to be used in combination with the ",[270,271,276],"a",{"href":272,"rel":273,"target":275},"https:\u002F\u002Fopenfeature.dev\u002Fdocs\u002Freference\u002Fsdks\u002Fserver\u002Fpython\u002F",[274],"noopener","_blank","OpenFeature Python SDK",". The provider wraps the ConfigDirector ",[270,279,280],{"href":163},"Python SDK",".",[266,283,284,285,281],{},"The minimum Python version supported is ",[286,287,288],"code",{},"3.10",[266,290,291],{},"The provider is thread safe. Register one instance per process when your application starts, and shut OpenFeature down when it stops. Evaluations read config state the provider already holds in memory, so they make no network calls on the request path.",[261,293,295],{"id":294},"installation","Installation",[266,297,298,299],{},"The provider can be installed from PyPI: ",[270,300,257],{"href":257,"rel":301,"target":275},[274],[266,303,304,305,308],{},"The OpenFeature Python SDK (",[286,306,307],{},"openfeature-sdk",") and the ConfigDirector Python SDK are included as dependencies.",[310,311,312],"code-group",{},[313,314,320],"pre",{"className":315,"code":316,"filename":317,"language":318,"meta":319,"style":319},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","pip install configdirector-openfeature-server-provider\n","pip","bash","",[286,321,322],{"__ignoreMap":319},[323,324,327,330,334],"span",{"class":325,"line":326},"line",1,[323,328,317],{"class":329},"sbgvK",[323,331,333],{"class":332},"s_sjI"," install",[323,335,336],{"class":332}," configdirector-openfeature-server-provider\n",[261,338,340],{"id":339},"configure-and-initialize-the-client","Configure and initialize the client",[342,343,344,352,355],"ol",{},[345,346,347,348,351],"li",{},"Create an instance of the provider using your server SDK key. You can retrieve a server SDK key for each environment under ",[286,349,350],{},"SDK keys"," in the dashboard's navigation panel.",[345,353,354],{},"Set the OpenFeature provider.",[345,356,357],{},"Get a client instance from OpenFeature.",[313,359,364],{"className":360,"code":361,"filename":362,"language":363,"meta":319,"style":319},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","from configdirector_openfeature import ConfigDirectorProvider\nfrom openfeature import api\n\napi.set_provider_and_wait(ConfigDirectorProvider(\"YOUR-SERVER-SDK-KEY\"))\nclient = api.get_client()\n","config_director_setup.py","python",[286,365,366,382,395,401,434],{"__ignoreMap":319},[323,367,368,372,376,379],{"class":325,"line":326},[323,369,371],{"class":370},"sVHd0","from",[323,373,375],{"class":374},"su5hD"," configdirector_openfeature ",[323,377,378],{"class":370},"import",[323,380,381],{"class":374}," ConfigDirectorProvider\n",[323,383,385,387,390,392],{"class":325,"line":384},2,[323,386,371],{"class":370},[323,388,389],{"class":374}," openfeature ",[323,391,378],{"class":370},[323,393,394],{"class":374}," api\n",[323,396,398],{"class":325,"line":397},3,[323,399,400],{"emptyLinePlaceholder":54},"\n",[323,402,404,407,410,414,417,420,422,426,429,431],{"class":325,"line":403},4,[323,405,406],{"class":374},"api",[323,408,281],{"class":409},"sP7_E",[323,411,413],{"class":412},"slqww","set_provider_and_wait",[323,415,416],{"class":409},"(",[323,418,419],{"class":412},"ConfigDirectorProvider",[323,421,416],{"class":409},[323,423,425],{"class":424},"sjJ54","\"",[323,427,428],{"class":332},"YOUR-SERVER-SDK-KEY",[323,430,425],{"class":424},[323,432,433],{"class":409},"))\n",[323,435,437,440,444,447,449,452],{"class":325,"line":436},5,[323,438,439],{"class":374},"client ",[323,441,443],{"class":442},"smGrS","=",[323,445,446],{"class":374}," api",[323,448,281],{"class":409},[323,450,451],{"class":412},"get_client",[323,453,454],{"class":409},"()\n",[456,457,458],"warning",{},"Server SDK keys are secret values. Do not commit them to your source code repository. Provide them at runtime via environment variables instead.",[266,460,461,463,464,467],{},[286,462,413],{}," blocks until the initial config state arrives or the configured timeout elapses, and it does not raise on a connection failure. Until config state arrives, evaluations return the default value with the ",[286,465,466],{},"PROVIDER_NOT_READY"," error code, and the provider continues to connect in the background.",[469,470,471,473,474,476,477,480,481,484],"note",{},[286,472,413],{}," requires ",[286,475,307],{}," version ",[286,478,479],{},"0.10"," or newer. On older versions use ",[286,482,483],{},"api.set_provider",", which waits for the provider to initialize.",[486,487,489],"h3",{"id":488},"additional-configuration-options","Additional configuration options",[266,491,492],{},"Additional configuration options can be passed into the provider as keyword arguments of the constructor.",[266,494,495,496,499],{},"For example, the ",[286,497,498],{},"metadata"," can be provided like this:",[313,501,503],{"className":360,"code":502,"filename":362,"language":363,"meta":319,"style":319},"from configdirector import Metadata\nfrom configdirector_openfeature import ConfigDirectorProvider\n\nprovider = ConfigDirectorProvider(\n    \"YOUR-SERVER-SDK-KEY\",\n    metadata=Metadata(app_name=\"YOUR-APP-NAME\", app_version=\"1.0.2\"),\n)\n",[286,504,505,517,527,531,544,556,600],{"__ignoreMap":319},[323,506,507,509,512,514],{"class":325,"line":326},[323,508,371],{"class":370},[323,510,511],{"class":374}," configdirector ",[323,513,378],{"class":370},[323,515,516],{"class":374}," Metadata\n",[323,518,519,521,523,525],{"class":325,"line":384},[323,520,371],{"class":370},[323,522,375],{"class":374},[323,524,378],{"class":370},[323,526,381],{"class":374},[323,528,529],{"class":325,"line":397},[323,530,400],{"emptyLinePlaceholder":54},[323,532,533,536,538,541],{"class":325,"line":403},[323,534,535],{"class":374},"provider ",[323,537,443],{"class":442},[323,539,540],{"class":412}," ConfigDirectorProvider",[323,542,543],{"class":409},"(\n",[323,545,546,549,551,553],{"class":325,"line":436},[323,547,548],{"class":424},"    \"",[323,550,428],{"class":332},[323,552,425],{"class":424},[323,554,555],{"class":409},",\n",[323,557,559,563,565,568,570,573,575,577,580,582,585,588,590,592,595,597],{"class":325,"line":558},6,[323,560,562],{"class":561},"s99_P","    metadata",[323,564,443],{"class":442},[323,566,567],{"class":412},"Metadata",[323,569,416],{"class":409},[323,571,572],{"class":561},"app_name",[323,574,443],{"class":442},[323,576,425],{"class":424},[323,578,579],{"class":332},"YOUR-APP-NAME",[323,581,425],{"class":424},[323,583,584],{"class":409},",",[323,586,587],{"class":561}," app_version",[323,589,443],{"class":442},[323,591,425],{"class":424},[323,593,594],{"class":332},"1.0.2",[323,596,425],{"class":424},[323,598,599],{"class":409},"),\n",[323,601,603],{"class":325,"line":602},7,[323,604,605],{"class":409},")\n",[266,607,608,609,611,612,611,615,611,618,621,622,625,626,281],{},"The provider accepts the same ",[286,610,498],{},", ",[286,613,614],{},"connection",[286,616,617],{},"logger",[286,619,620],{},"log_level",", and ",[286,623,624],{},"telemetry"," options as the Python SDK client, ",[270,627,629],{"href":628},"\u002Fsdks\u002Fserver\u002Fpython#additional-configuration-options","refer to the additional configuration options section of the Python SDK for a full list",[486,631,633],{"id":632},"shut-down","Shut down",[266,635,636],{},"Shutting OpenFeature down closes the provider, which closes its connections and reports any pending telemetry:",[313,638,641],{"className":360,"code":639,"filename":640,"language":363,"meta":319,"style":319},"import atexit\n\nfrom openfeature import api\n\natexit.register(api.shutdown)\n","main.py",[286,642,643,650,654,664,668],{"__ignoreMap":319},[323,644,645,647],{"class":325,"line":326},[323,646,378],{"class":370},[323,648,649],{"class":374}," atexit\n",[323,651,652],{"class":325,"line":384},[323,653,400],{"emptyLinePlaceholder":54},[323,655,656,658,660,662],{"class":325,"line":397},[323,657,371],{"class":370},[323,659,389],{"class":374},[323,661,378],{"class":370},[323,663,394],{"class":374},[323,665,666],{"class":325,"line":403},[323,667,400],{"emptyLinePlaceholder":54},[323,669,670,673,675,678,680,682,684,688],{"class":325,"line":436},[323,671,672],{"class":374},"atexit",[323,674,281],{"class":409},[323,676,677],{"class":412},"register",[323,679,416],{"class":409},[323,681,406],{"class":412},[323,683,281],{"class":409},[323,685,687],{"class":686},"skxfh","shutdown",[323,689,605],{"class":409},[261,691,693],{"id":692},"retrieve-config-values","Retrieve config values",[266,695,696],{},"To retrieve config values, use the OpenFeature client:",[313,698,700],{"className":360,"code":699,"filename":640,"language":363,"meta":319,"style":319},"boolean_value = client.get_boolean_value(\"my-config-key\", False)\n\nstring_value = client.get_string_value(\"my-string-config-key\", \"Default\")\n",[286,701,702,734,738],{"__ignoreMap":319},[323,703,704,707,709,712,714,717,719,721,724,726,728,732],{"class":325,"line":326},[323,705,706],{"class":374},"boolean_value ",[323,708,443],{"class":442},[323,710,711],{"class":374}," client",[323,713,281],{"class":409},[323,715,716],{"class":412},"get_boolean_value",[323,718,416],{"class":409},[323,720,425],{"class":424},[323,722,723],{"class":332},"my-config-key",[323,725,425],{"class":424},[323,727,584],{"class":409},[323,729,731],{"class":730},"s39Yj"," False",[323,733,605],{"class":409},[323,735,736],{"class":325,"line":384},[323,737,400],{"emptyLinePlaceholder":54},[323,739,740,743,745,747,749,752,754,756,759,761,763,766,769,771],{"class":325,"line":397},[323,741,742],{"class":374},"string_value ",[323,744,443],{"class":442},[323,746,711],{"class":374},[323,748,281],{"class":409},[323,750,751],{"class":412},"get_string_value",[323,753,416],{"class":409},[323,755,425],{"class":424},[323,757,758],{"class":332},"my-string-config-key",[323,760,425],{"class":424},[323,762,584],{"class":409},[323,764,765],{"class":424}," \"",[323,767,768],{"class":332},"Default",[323,770,425],{"class":424},[323,772,605],{"class":409},[266,774,775],{},"Each OpenFeature getter maps to a ConfigDirector config type:",[777,778,779,792],"table",{},[780,781,782],"thead",{},[783,784,785,789],"tr",{},[786,787,788],"th",{},"OpenFeature getter",[786,790,791],{},"ConfigDirector config value",[793,794,795,805,814,827],"tbody",{},[783,796,797,802],{},[798,799,800],"td",{},[286,801,716],{},[798,803,804],{},"Boolean",[783,806,807,811],{},[798,808,809],{},[286,810,751],{},[798,812,813],{},"String or enum",[783,815,816,824],{},[798,817,818,611,821],{},[286,819,820],{},"get_integer_value",[286,822,823],{},"get_float_value",[798,825,826],{},"Number",[783,828,829,834],{},[798,830,831],{},[286,832,833],{},"get_object_value",[798,835,836],{},"JSON object or JSON array",[266,838,839,841,842,845,846,849],{},[286,840,833],{}," returns the parsed JSON, a ",[286,843,844],{},"dict"," for a JSON object or a ",[286,847,848],{},"list"," for a JSON array:",[313,851,853],{"className":360,"code":852,"filename":640,"language":363,"meta":319,"style":319},"settings = client.get_object_value(\"my-json-config-key\", {})\ntheme = settings.get(\"theme\")\n",[286,854,855,882],{"__ignoreMap":319},[323,856,857,860,862,864,866,868,870,872,875,877,879],{"class":325,"line":326},[323,858,859],{"class":374},"settings ",[323,861,443],{"class":442},[323,863,711],{"class":374},[323,865,281],{"class":409},[323,867,833],{"class":412},[323,869,416],{"class":409},[323,871,425],{"class":424},[323,873,874],{"class":332},"my-json-config-key",[323,876,425],{"class":424},[323,878,584],{"class":409},[323,880,881],{"class":409}," {})\n",[323,883,884,887,889,892,894,897,899,901,904,906],{"class":325,"line":384},[323,885,886],{"class":374},"theme ",[323,888,443],{"class":442},[323,890,891],{"class":374}," settings",[323,893,281],{"class":409},[323,895,896],{"class":412},"get",[323,898,416],{"class":409},[323,900,425],{"class":424},[323,902,903],{"class":332},"theme",[323,905,425],{"class":424},[323,907,605],{"class":409},[266,909,910,911,281],{},"For additional information regarding the OpenFeature client ",[270,912,914],{"href":272,"rel":913,"target":275},[274],"refer to the OpenFeature Python SDK documentation",[486,916,918],{"id":917},"evaluation-details","Evaluation details",[266,920,921,922,925],{},"The detailed getters of the OpenFeature client, such as ",[286,923,924],{},"get_boolean_details",", report why an evaluation produced the value that it did:",[777,927,928,941],{},[780,929,930],{},[783,931,932,935,938],{},[786,933,934],{},"Outcome",[786,936,937],{},"Reason",[786,939,940],{},"Error code",[793,942,943,955,967,982,995],{},[783,944,945,948,953],{},[798,946,947],{},"A value was found",[798,949,950],{},[286,951,952],{},"TARGETING_MATCH",[798,954],{},[783,956,957,960,965],{},[798,958,959],{},"The config carries no value",[798,961,962],{},[286,963,964],{},"DEFAULT",[798,966],{},[783,968,969,972,977],{},[798,970,971],{},"The config key is unknown",[798,973,974],{},[286,975,976],{},"ERROR",[798,978,979],{},[286,980,981],{},"FLAG_NOT_FOUND",[783,983,984,987,991],{},[798,985,986],{},"No config state has arrived yet",[798,988,989],{},[286,990,976],{},[798,992,993],{},[286,994,466],{},[783,996,997,1000,1004],{},[798,998,999],{},"The value does not match the requested type",[798,1001,1002],{},[286,1003,976],{},[798,1005,1006],{},[286,1007,1008],{},"TYPE_MISMATCH",[266,1010,1011,1012,1015],{},"When a value was found, the ",[286,1013,1014],{},"variant"," is ConfigDirector's identifier for that value. In every other case the default value is returned.",[261,1017,1019],{"id":1018},"user-context","User context",[266,1021,1022],{},"The user context can be provided as the third argument to value getter functions of the OpenFeature client. The OpenFeature Python provider evaluates targeting rules locally without additional network calls for different contexts.",[313,1024,1026],{"className":360,"code":1025,"filename":640,"language":363,"meta":319,"style":319},"from openfeature.evaluation_context import EvaluationContext\n\ncontext = EvaluationContext(\n    \"12345\",  # In OpenFeature, the targeting key represents the context's user ID\n    {\n        \"name\": \"Example User\",\n        # Any arbitrary traits which can be referenced in targeting rules\n        \"traits\": {\"region\": \"North America\"},\n    },\n)\n\nboolean_value = client.get_boolean_value(\"my-config-key\", False, context)\n",[286,1027,1028,1045,1049,1061,1076,1081,1103,1108,1142,1148,1153,1158],{"__ignoreMap":319},[323,1029,1030,1032,1035,1037,1040,1042],{"class":325,"line":326},[323,1031,371],{"class":370},[323,1033,1034],{"class":374}," openfeature",[323,1036,281],{"class":409},[323,1038,1039],{"class":374},"evaluation_context ",[323,1041,378],{"class":370},[323,1043,1044],{"class":374}," EvaluationContext\n",[323,1046,1047],{"class":325,"line":384},[323,1048,400],{"emptyLinePlaceholder":54},[323,1050,1051,1054,1056,1059],{"class":325,"line":397},[323,1052,1053],{"class":374},"context ",[323,1055,443],{"class":442},[323,1057,1058],{"class":412}," EvaluationContext",[323,1060,543],{"class":409},[323,1062,1063,1065,1068,1070,1072],{"class":325,"line":403},[323,1064,548],{"class":424},[323,1066,1067],{"class":332},"12345",[323,1069,425],{"class":424},[323,1071,584],{"class":409},[323,1073,1075],{"class":1074},"sutJx","  # In OpenFeature, the targeting key represents the context's user ID\n",[323,1077,1078],{"class":325,"line":436},[323,1079,1080],{"class":409},"    {\n",[323,1082,1083,1086,1089,1091,1094,1096,1099,1101],{"class":325,"line":558},[323,1084,1085],{"class":424},"        \"",[323,1087,1088],{"class":332},"name",[323,1090,425],{"class":424},[323,1092,1093],{"class":409},":",[323,1095,765],{"class":424},[323,1097,1098],{"class":332},"Example User",[323,1100,425],{"class":424},[323,1102,555],{"class":409},[323,1104,1105],{"class":325,"line":602},[323,1106,1107],{"class":1074},"        # Any arbitrary traits which can be referenced in targeting rules\n",[323,1109,1111,1113,1116,1118,1120,1123,1125,1128,1130,1132,1134,1137,1139],{"class":325,"line":1110},8,[323,1112,1085],{"class":424},[323,1114,1115],{"class":332},"traits",[323,1117,425],{"class":424},[323,1119,1093],{"class":409},[323,1121,1122],{"class":409}," {",[323,1124,425],{"class":424},[323,1126,1127],{"class":332},"region",[323,1129,425],{"class":424},[323,1131,1093],{"class":409},[323,1133,765],{"class":424},[323,1135,1136],{"class":332},"North America",[323,1138,425],{"class":424},[323,1140,1141],{"class":409},"},\n",[323,1143,1145],{"class":325,"line":1144},9,[323,1146,1147],{"class":409},"    },\n",[323,1149,1151],{"class":325,"line":1150},10,[323,1152,605],{"class":409},[323,1154,1156],{"class":325,"line":1155},11,[323,1157,400],{"emptyLinePlaceholder":54},[323,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1188],{"class":325,"line":1160},12,[323,1162,706],{"class":374},[323,1164,443],{"class":442},[323,1166,711],{"class":374},[323,1168,281],{"class":409},[323,1170,716],{"class":412},[323,1172,416],{"class":409},[323,1174,425],{"class":424},[323,1176,723],{"class":332},[323,1178,425],{"class":424},[323,1180,584],{"class":409},[323,1182,731],{"class":730},[323,1184,584],{"class":409},[323,1186,1187],{"class":412}," context",[323,1189,605],{"class":409},[266,1191,1192],{},"The evaluation context maps onto the ConfigDirector user context as follows:",[777,1194,1195,1205],{},[780,1196,1197],{},[783,1198,1199,1202],{},[786,1200,1201],{},"OpenFeature evaluation context",[786,1203,1204],{},"ConfigDirector user context",[793,1206,1207,1220,1231,1242],{},[783,1208,1209,1216],{},[798,1210,1211,1212,1215],{},"The targeting key, or otherwise an ",[286,1213,1214],{},"id"," attribute",[798,1217,1218],{},[286,1219,1214],{},[783,1221,1222,1227],{},[798,1223,1224,1225,1215],{},"The ",[286,1226,1088],{},[798,1228,1229],{},[286,1230,1088],{},[783,1232,1233,1238],{},[798,1234,1224,1235,1237],{},[286,1236,1115],{}," mapping attribute",[798,1239,1240],{},[286,1241,1115],{},[783,1243,1244,1250],{},[798,1245,1246,1247,1215],{},"The boolean ",[286,1248,1249],{},"anonymous",[798,1251,1252],{},[286,1253,1249],{},[266,1255,910,1256,281],{},[270,1257,914],{"href":272,"rel":1258,"target":275},[274],[261,1260,1262],{"id":1261},"events","Events",[266,1264,1265,1266,1269],{},"The provider emits ",[286,1267,1268],{},"PROVIDER_CONFIGURATION_CHANGED"," whenever configs are updated on the dashboard or via the admin API, carrying the keys of the configs in the update:",[313,1271,1273],{"className":360,"code":1272,"filename":640,"language":363,"meta":319,"style":319},"from openfeature import api\nfrom openfeature.event import EventDetails, ProviderEvent\n\n\ndef on_configuration_changed(details: EventDetails) -> None:\n    print(f\"Configs updated: {details.flags_changed}\")\n\n\napi.add_handler(ProviderEvent.PROVIDER_CONFIGURATION_CHANGED, on_configuration_changed)\n",[286,1274,1275,1285,1306,1310,1314,1346,1378,1382,1386],{"__ignoreMap":319},[323,1276,1277,1279,1281,1283],{"class":325,"line":326},[323,1278,371],{"class":370},[323,1280,389],{"class":374},[323,1282,378],{"class":370},[323,1284,394],{"class":374},[323,1286,1287,1289,1291,1293,1296,1298,1301,1303],{"class":325,"line":384},[323,1288,371],{"class":370},[323,1290,1034],{"class":374},[323,1292,281],{"class":409},[323,1294,1295],{"class":374},"event ",[323,1297,378],{"class":370},[323,1299,1300],{"class":374}," EventDetails",[323,1302,584],{"class":409},[323,1304,1305],{"class":374}," ProviderEvent\n",[323,1307,1308],{"class":325,"line":397},[323,1309,400],{"emptyLinePlaceholder":54},[323,1311,1312],{"class":325,"line":403},[323,1313,400],{"emptyLinePlaceholder":54},[323,1315,1316,1320,1324,1326,1330,1332,1334,1337,1340,1343],{"class":325,"line":436},[323,1317,1319],{"class":1318},"sbsja","def",[323,1321,1323],{"class":1322},"sGLFI"," on_configuration_changed",[323,1325,416],{"class":409},[323,1327,1329],{"class":1328},"sFwrP","details",[323,1331,1093],{"class":409},[323,1333,1300],{"class":374},[323,1335,1336],{"class":409},")",[323,1338,1339],{"class":409}," ->",[323,1341,1342],{"class":730}," None",[323,1344,1345],{"class":409},":\n",[323,1347,1348,1352,1354,1357,1360,1364,1366,1368,1371,1374,1376],{"class":325,"line":558},[323,1349,1351],{"class":1350},"sptTA","    print",[323,1353,416],{"class":409},[323,1355,1356],{"class":1318},"f",[323,1358,1359],{"class":332},"\"Configs updated: ",[323,1361,1363],{"class":1362},"srdBf","{",[323,1365,1329],{"class":412},[323,1367,281],{"class":409},[323,1369,1370],{"class":686},"flags_changed",[323,1372,1373],{"class":1362},"}",[323,1375,425],{"class":332},[323,1377,605],{"class":409},[323,1379,1380],{"class":325,"line":602},[323,1381,400],{"emptyLinePlaceholder":54},[323,1383,1384],{"class":325,"line":1110},[323,1385,400],{"emptyLinePlaceholder":54},[323,1387,1388,1390,1392,1395,1397,1400,1402,1405,1407,1409],{"class":325,"line":1144},[323,1389,406],{"class":374},[323,1391,281],{"class":409},[323,1393,1394],{"class":412},"add_handler",[323,1396,416],{"class":409},[323,1398,1399],{"class":412},"ProviderEvent",[323,1401,281],{"class":409},[323,1403,1268],{"class":1404},"swQdS",[323,1406,584],{"class":409},[323,1408,1323],{"class":412},[323,1410,605],{"class":409},[266,1412,1413,1414,1417,1418,1420],{},"It emits ",[286,1415,1416],{},"PROVIDER_READY"," when the initial config state arrives after ",[286,1419,413],{}," has already returned.",[261,1422,1424],{"id":1423},"test-your-code","Test your code",[266,1426,1427,1428,1431],{},"Code that reads flags through OpenFeature is tested by swapping the provider, so it never has to change for a test and nothing from ConfigDirector is involved. The OpenFeature Python SDK ships an in-memory provider for that, ",[286,1429,1430],{},"InMemoryProvider",", which serves the values your test sets.",[266,1433,1434,1435,1438],{},"Each flag is an ",[286,1436,1437],{},"InMemoryFlag"," with the name of the variant it resolves to and its named variants:",[313,1440,1443],{"className":360,"code":1441,"filename":1442,"language":363,"meta":319,"style":319},"import pytest\nfrom openfeature import api\nfrom openfeature.provider.in_memory_provider import InMemoryFlag, InMemoryProvider\n\n\n@pytest.fixture(autouse=True)\ndef shut_openfeature_down():\n    yield\n    api.shutdown()\n\n\ndef test_shows_the_new_checkout():\n    api.set_provider_and_wait(\n        InMemoryProvider(\n            {\n                \"new-checkout\": InMemoryFlag(\"on\", {\"on\": True, \"off\": False}),\n                \"max-items\": InMemoryFlag(\"default\", {\"default\": 20}),\n            }\n        )\n    )\n    client = api.get_client()\n\n    assert client.get_boolean_value(\"new-checkout\", False) is True\n    assert client.get_integer_value(\"max-items\", 0) == 20\n","test_checkout.py",[286,1444,1445,1452,1462,1488,1492,1496,1522,1532,1537,1548,1552,1556,1565,1576,1584,1590,1645,1685,1691,1697,1703,1719,1724,1756],{"__ignoreMap":319},[323,1446,1447,1449],{"class":325,"line":326},[323,1448,378],{"class":370},[323,1450,1451],{"class":374}," pytest\n",[323,1453,1454,1456,1458,1460],{"class":325,"line":384},[323,1455,371],{"class":370},[323,1457,389],{"class":374},[323,1459,378],{"class":370},[323,1461,394],{"class":374},[323,1463,1464,1466,1468,1470,1473,1475,1478,1480,1483,1485],{"class":325,"line":397},[323,1465,371],{"class":370},[323,1467,1034],{"class":374},[323,1469,281],{"class":409},[323,1471,1472],{"class":374},"provider",[323,1474,281],{"class":409},[323,1476,1477],{"class":374},"in_memory_provider ",[323,1479,378],{"class":370},[323,1481,1482],{"class":374}," InMemoryFlag",[323,1484,584],{"class":409},[323,1486,1487],{"class":374}," InMemoryProvider\n",[323,1489,1490],{"class":325,"line":403},[323,1491,400],{"emptyLinePlaceholder":54},[323,1493,1494],{"class":325,"line":436},[323,1495,400],{"emptyLinePlaceholder":54},[323,1497,1498,1502,1505,1507,1510,1512,1515,1517,1520],{"class":325,"line":558},[323,1499,1501],{"class":1500},"stp6e","@",[323,1503,1504],{"class":1322},"pytest",[323,1506,281],{"class":1500},[323,1508,1509],{"class":1322},"fixture",[323,1511,416],{"class":409},[323,1513,1514],{"class":561},"autouse",[323,1516,443],{"class":442},[323,1518,1519],{"class":730},"True",[323,1521,605],{"class":409},[323,1523,1524,1526,1529],{"class":325,"line":602},[323,1525,1319],{"class":1318},[323,1527,1528],{"class":1322}," shut_openfeature_down",[323,1530,1531],{"class":409},"():\n",[323,1533,1534],{"class":325,"line":1110},[323,1535,1536],{"class":370},"    yield\n",[323,1538,1539,1542,1544,1546],{"class":325,"line":1144},[323,1540,1541],{"class":374},"    api",[323,1543,281],{"class":409},[323,1545,687],{"class":412},[323,1547,454],{"class":409},[323,1549,1550],{"class":325,"line":1150},[323,1551,400],{"emptyLinePlaceholder":54},[323,1553,1554],{"class":325,"line":1155},[323,1555,400],{"emptyLinePlaceholder":54},[323,1557,1558,1560,1563],{"class":325,"line":1160},[323,1559,1319],{"class":1318},[323,1561,1562],{"class":1322}," test_shows_the_new_checkout",[323,1564,1531],{"class":409},[323,1566,1568,1570,1572,1574],{"class":325,"line":1567},13,[323,1569,1541],{"class":374},[323,1571,281],{"class":409},[323,1573,413],{"class":412},[323,1575,543],{"class":409},[323,1577,1579,1582],{"class":325,"line":1578},14,[323,1580,1581],{"class":412},"        InMemoryProvider",[323,1583,543],{"class":409},[323,1585,1587],{"class":325,"line":1586},15,[323,1588,1589],{"class":409},"            {\n",[323,1591,1593,1596,1599,1601,1603,1605,1607,1609,1612,1614,1616,1618,1620,1622,1624,1626,1629,1631,1633,1636,1638,1640,1642],{"class":325,"line":1592},16,[323,1594,1595],{"class":424},"                \"",[323,1597,1598],{"class":332},"new-checkout",[323,1600,425],{"class":424},[323,1602,1093],{"class":409},[323,1604,1482],{"class":412},[323,1606,416],{"class":409},[323,1608,425],{"class":424},[323,1610,1611],{"class":332},"on",[323,1613,425],{"class":424},[323,1615,584],{"class":409},[323,1617,1122],{"class":409},[323,1619,425],{"class":424},[323,1621,1611],{"class":332},[323,1623,425],{"class":424},[323,1625,1093],{"class":409},[323,1627,1628],{"class":730}," True",[323,1630,584],{"class":409},[323,1632,765],{"class":424},[323,1634,1635],{"class":332},"off",[323,1637,425],{"class":424},[323,1639,1093],{"class":409},[323,1641,731],{"class":730},[323,1643,1644],{"class":409},"}),\n",[323,1646,1648,1650,1653,1655,1657,1659,1661,1663,1666,1668,1670,1672,1674,1676,1678,1680,1683],{"class":325,"line":1647},17,[323,1649,1595],{"class":424},[323,1651,1652],{"class":332},"max-items",[323,1654,425],{"class":424},[323,1656,1093],{"class":409},[323,1658,1482],{"class":412},[323,1660,416],{"class":409},[323,1662,425],{"class":424},[323,1664,1665],{"class":332},"default",[323,1667,425],{"class":424},[323,1669,584],{"class":409},[323,1671,1122],{"class":409},[323,1673,425],{"class":424},[323,1675,1665],{"class":332},[323,1677,425],{"class":424},[323,1679,1093],{"class":409},[323,1681,1682],{"class":1362}," 20",[323,1684,1644],{"class":409},[323,1686,1688],{"class":325,"line":1687},18,[323,1689,1690],{"class":409},"            }\n",[323,1692,1694],{"class":325,"line":1693},19,[323,1695,1696],{"class":409},"        )\n",[323,1698,1700],{"class":325,"line":1699},20,[323,1701,1702],{"class":409},"    )\n",[323,1704,1706,1709,1711,1713,1715,1717],{"class":325,"line":1705},21,[323,1707,1708],{"class":374},"    client ",[323,1710,443],{"class":442},[323,1712,446],{"class":374},[323,1714,281],{"class":409},[323,1716,451],{"class":412},[323,1718,454],{"class":409},[323,1720,1722],{"class":325,"line":1721},22,[323,1723,400],{"emptyLinePlaceholder":54},[323,1725,1727,1730,1732,1734,1736,1738,1740,1742,1744,1746,1748,1750,1753],{"class":325,"line":1726},23,[323,1728,1729],{"class":370},"    assert",[323,1731,711],{"class":374},[323,1733,281],{"class":409},[323,1735,716],{"class":412},[323,1737,416],{"class":409},[323,1739,425],{"class":424},[323,1741,1598],{"class":332},[323,1743,425],{"class":424},[323,1745,584],{"class":409},[323,1747,731],{"class":730},[323,1749,1336],{"class":409},[323,1751,1752],{"class":442}," is",[323,1754,1755],{"class":730}," True\n",[323,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1780,1782,1785],{"class":325,"line":1758},24,[323,1760,1729],{"class":370},[323,1762,711],{"class":374},[323,1764,281],{"class":409},[323,1766,820],{"class":412},[323,1768,416],{"class":409},[323,1770,425],{"class":424},[323,1772,1652],{"class":332},[323,1774,425],{"class":424},[323,1776,584],{"class":409},[323,1778,1779],{"class":1362}," 0",[323,1781,1336],{"class":409},[323,1783,1784],{"class":442}," ==",[323,1786,1787],{"class":1362}," 20\n",[266,1789,1790,1791,1793],{},"The provider copies the flags it is given and has no method to change them, so a test that changes a value mid-way sets a new provider with ",[286,1792,413],{},". That emits no configuration-changed event; a test of code that reacts to one asks the current provider to emit it:",[313,1795,1797],{"className":360,"code":1796,"filename":1442,"language":363,"meta":319,"style":319},"from openfeature.event import ProviderEventDetails\n\nprovider = InMemoryProvider({\"new-checkout\": InMemoryFlag(\"off\", {\"on\": True, \"off\": False})})\napi.set_provider_and_wait(provider)\nprovider.emit_provider_configuration_changed(ProviderEventDetails(flags_changed=[\"new-checkout\"]))\n",[286,1798,1799,1814,1818,1877,1891],{"__ignoreMap":319},[323,1800,1801,1803,1805,1807,1809,1811],{"class":325,"line":326},[323,1802,371],{"class":370},[323,1804,1034],{"class":374},[323,1806,281],{"class":409},[323,1808,1295],{"class":374},[323,1810,378],{"class":370},[323,1812,1813],{"class":374}," ProviderEventDetails\n",[323,1815,1816],{"class":325,"line":384},[323,1817,400],{"emptyLinePlaceholder":54},[323,1819,1820,1822,1824,1827,1830,1832,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874],{"class":325,"line":397},[323,1821,535],{"class":374},[323,1823,443],{"class":442},[323,1825,1826],{"class":412}," InMemoryProvider",[323,1828,1829],{"class":409},"({",[323,1831,425],{"class":424},[323,1833,1598],{"class":332},[323,1835,425],{"class":424},[323,1837,1093],{"class":409},[323,1839,1482],{"class":412},[323,1841,416],{"class":409},[323,1843,425],{"class":424},[323,1845,1635],{"class":332},[323,1847,425],{"class":424},[323,1849,584],{"class":409},[323,1851,1122],{"class":409},[323,1853,425],{"class":424},[323,1855,1611],{"class":332},[323,1857,425],{"class":424},[323,1859,1093],{"class":409},[323,1861,1628],{"class":730},[323,1863,584],{"class":409},[323,1865,765],{"class":424},[323,1867,1635],{"class":332},[323,1869,425],{"class":424},[323,1871,1093],{"class":409},[323,1873,731],{"class":730},[323,1875,1876],{"class":409},"})})\n",[323,1878,1879,1881,1883,1885,1887,1889],{"class":325,"line":403},[323,1880,406],{"class":374},[323,1882,281],{"class":409},[323,1884,413],{"class":412},[323,1886,416],{"class":409},[323,1888,1472],{"class":412},[323,1890,605],{"class":409},[323,1892,1893,1895,1897,1900,1902,1905,1907,1909,1911,1914,1916,1918,1920],{"class":325,"line":436},[323,1894,1472],{"class":374},[323,1896,281],{"class":409},[323,1898,1899],{"class":412},"emit_provider_configuration_changed",[323,1901,416],{"class":409},[323,1903,1904],{"class":412},"ProviderEventDetails",[323,1906,416],{"class":409},[323,1908,1370],{"class":561},[323,1910,443],{"class":442},[323,1912,1913],{"class":409},"[",[323,1915,425],{"class":424},[323,1917,1598],{"class":332},[323,1919,425],{"class":424},[323,1921,1922],{"class":409},"]))\n",[266,1924,1925,473,1927,1929,1930,1932,1933,1936,1937,1940],{},[286,1926,413],{},[286,1928,307],{}," 0.10 or newer; on older versions ",[286,1931,483],{}," waits for the provider to initialize. The OpenFeature API is one global, so shut it down after each test with ",[286,1934,1935],{},"api.shutdown()",", as the fixture above does, which lets the next test register its own provider. A flag can also carry a ",[286,1938,1939],{},"context_evaluator",", a function from the flag and the evaluation context to the resolution details, for a test of code that targets specific users.",[1942,1943,1944],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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);}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sFwrP, html code.shiki .sFwrP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .swQdS, html code.shiki .swQdS{--shiki-light:#E53935;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .stp6e, html code.shiki .stp6e{--shiki-light:#39ADB5;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":319,"searchDepth":384,"depth":384,"links":1946},[1947,1948,1949,1953,1956,1957,1958],{"id":263,"depth":384,"text":264},{"id":294,"depth":384,"text":295},{"id":339,"depth":384,"text":340,"children":1950},[1951,1952],{"id":488,"depth":397,"text":489},{"id":632,"depth":397,"text":633},{"id":692,"depth":384,"text":693,"children":1954},[1955],{"id":917,"depth":397,"text":918},{"id":1018,"depth":384,"text":1019},{"id":1261,"depth":384,"text":1262},{"id":1423,"depth":384,"text":1424},"ConfigDirector Provider for the OpenFeature Python SDK","md",null,{"modifiedAt":1963},"2026-10-12T00:22:49.000Z",{"title":162,"icon":183,"icons":1965},[183,165],{"title":246,"description":1959},"jULDsDJAeLwTuPcmIvqHRayDpV9UWZVb6t-cG5FdCFU",[1969,1972],{"title":157,"path":205,"stem":206,"description":1970,"icon":183,"icons":1971,"children":-1},"ConfigDirector Provider for the OpenFeature Node.js SDK",[183,160],{"title":167,"path":213,"stem":214,"description":1973,"icon":183,"icons":1974,"children":-1},"ConfigDirector Provider for the OpenFeature Java SDK",[183,170],1791783867893]