diffusers-workflow 0.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. diffusers_workflow-0.4.0.dist-info/METADATA +318 -0
  2. diffusers_workflow-0.4.0.dist-info/RECORD +260 -0
  3. diffusers_workflow-0.4.0.dist-info/WHEEL +5 -0
  4. diffusers_workflow-0.4.0.dist-info/entry_points.txt +7 -0
  5. diffusers_workflow-0.4.0.dist-info/licenses/LICENSE +201 -0
  6. diffusers_workflow-0.4.0.dist-info/top_level.txt +2 -0
  7. dw/__init__.py +440 -0
  8. dw/adapter_compatibility.py +226 -0
  9. dw/arguments.py +1231 -0
  10. dw/assessment_rules.py +159 -0
  11. dw/assets.py +130 -0
  12. dw/cache_blocks.json +16 -0
  13. dw/cache_blocks.py +146 -0
  14. dw/community_pipelines/pipeline_flux_rf_inversion.py +1184 -0
  15. dw/content_types.py +150 -0
  16. dw/dissolve_frame_errors.py +121 -0
  17. dw/docs/ACCELERATION.md +352 -0
  18. dw/docs/AGENT_LOOP.md +95 -0
  19. dw/docs/DEPENDENCIES.md +91 -0
  20. dw/docs/IP_ADAPTER.md +109 -0
  21. dw/docs/LORAS.md +131 -0
  22. dw/docs/MCP.md +517 -0
  23. dw/docs/PROMPT_WEIGHTING.md +78 -0
  24. dw/docs/QUANTIZATION.md +230 -0
  25. dw/docs/RECIPES_24GB.md +201 -0
  26. dw/docs/RELEASING.md +195 -0
  27. dw/docs/REMOTE.md +140 -0
  28. dw/docs/REPL_COMMANDS.md +121 -0
  29. dw/docs/REPL_WORKER_GUIDE.md +51 -0
  30. dw/docs/SECURITY.md +272 -0
  31. dw/docs/SECURITY_QUICKREF.md +112 -0
  32. dw/docs/SERVER.md +679 -0
  33. dw/docs/TASKS.md +1741 -0
  34. dw/docs/TESTING.md +71 -0
  35. dw/docs/WORKFLOW_GUIDE.md +2038 -0
  36. dw/docs/WORKSPACES.md +316 -0
  37. dw/download_watch.py +335 -0
  38. dw/elision.py +306 -0
  39. dw/events.py +275 -0
  40. dw/for_each.py +409 -0
  41. dw/host_memory.py +258 -0
  42. dw/host_memory_projection.py +230 -0
  43. dw/hub_cache.py +432 -0
  44. dw/introspection.py +1228 -0
  45. dw/kernel_availability.py +208 -0
  46. dw/locations.py +599 -0
  47. dw/log_setup.py +45 -0
  48. dw/loudness.py +82 -0
  49. dw/media_audio.py +217 -0
  50. dw/media_frames.py +367 -0
  51. dw/media_info.py +297 -0
  52. dw/pipeline_processors/chain.py +821 -0
  53. dw/pipeline_processors/config_objects.py +237 -0
  54. dw/pipeline_processors/pipeline.py +2297 -0
  55. dw/pipeline_processors/remote.py +46 -0
  56. dw/plan.py +920 -0
  57. dw/previous_results.py +411 -0
  58. dw/probe_paths.py +59 -0
  59. dw/prompt_schema.json +48 -0
  60. dw/prompt_weighting.py +378 -0
  61. dw/prompts.py +159 -0
  62. dw/realize.py +250 -0
  63. dw/reference_limits.py +215 -0
  64. dw/reference_names.py +125 -0
  65. dw/repl.py +338 -0
  66. dw/repl_commands.py +836 -0
  67. dw/repl_worker.py +159 -0
  68. dw/result.py +1720 -0
  69. dw/result_fps.py +82 -0
  70. dw/run.py +162 -0
  71. dw/runs.py +768 -0
  72. dw/scalar_result_validation.py +97 -0
  73. dw/schema.py +283 -0
  74. dw/security.py +1038 -0
  75. dw/select_validation.py +115 -0
  76. dw/serve.py +277 -0
  77. dw/server/__init__.py +2 -0
  78. dw/server/app.py +4586 -0
  79. dw/server/assess.py +132 -0
  80. dw/server/catalog_shape.py +487 -0
  81. dw/server/enhancers.py +129 -0
  82. dw/server/exports.py +480 -0
  83. dw/server/guides.py +257 -0
  84. dw/server/jobs.py +1561 -0
  85. dw/server/mcp_mount.py +95 -0
  86. dw/server/netinfo.py +124 -0
  87. dw/server/observed_cost.py +379 -0
  88. dw/server/sysinfo.py +71 -0
  89. dw/server/ui/assets/abap-08VXUWAP.js +1 -0
  90. dw/server/ui/assets/apex-BWPQTe0t.js +1 -0
  91. dw/server/ui/assets/azcli-Bc_sGQ0U.js +1 -0
  92. dw/server/ui/assets/bat-i0X4ZdIN.js +1 -0
  93. dw/server/ui/assets/bicep-B5-_aFwp.js +2 -0
  94. dw/server/ui/assets/cameligo-DMUM7wLl.js +1 -0
  95. dw/server/ui/assets/clojure-Cm7r79vr.js +1 -0
  96. dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
  97. dw/server/ui/assets/coffee-Ba7i2nA0.js +1 -0
  98. dw/server/ui/assets/cpp-C7h46wYY.js +1 -0
  99. dw/server/ui/assets/csharp-BKxtCVv1.js +1 -0
  100. dw/server/ui/assets/csp-bTuwJoIa.js +1 -0
  101. dw/server/ui/assets/css-DIMkf-bt.js +3 -0
  102. dw/server/ui/assets/css.worker-B3ciXF_0.js +93 -0
  103. dw/server/ui/assets/cssMode-CPznxfY8.js +1 -0
  104. dw/server/ui/assets/cypher-CVaqCwHa.js +1 -0
  105. dw/server/ui/assets/dart-onAF5SnQ.js +1 -0
  106. dw/server/ui/assets/dockerfile-DZFCIeNp.js +1 -0
  107. dw/server/ui/assets/ecl-D05T4iGw.js +1 -0
  108. dw/server/ui/assets/editor-jjEx9u7D.css +1 -0
  109. dw/server/ui/assets/editor.api-CpWcotrd.js +847 -0
  110. dw/server/ui/assets/editor.worker-q-txB4vs.js +30 -0
  111. dw/server/ui/assets/elixir-6RTg0lbw.js +1 -0
  112. dw/server/ui/assets/flow9-C5_-GSwl.js +1 -0
  113. dw/server/ui/assets/freemarker2-CXtRM8N4.js +3 -0
  114. dw/server/ui/assets/fsharp-C8Ef5oNN.js +1 -0
  115. dw/server/ui/assets/go-C-y9NEjX.js +1 -0
  116. dw/server/ui/assets/graphql-fmXr3nnJ.js +1 -0
  117. dw/server/ui/assets/handlebars-N7x-6NMY.js +1 -0
  118. dw/server/ui/assets/hcl-CpzslTdj.js +1 -0
  119. dw/server/ui/assets/html-PhsdjHSr.js +1 -0
  120. dw/server/ui/assets/html.worker-C93Ht9o9.js +506 -0
  121. dw/server/ui/assets/htmlMode-Dgj0SEok.js +1 -0
  122. dw/server/ui/assets/index-3Vw6WAPW.css +1 -0
  123. dw/server/ui/assets/index-DgrYhQd9.js +43 -0
  124. dw/server/ui/assets/ini-sBoK_t0W.js +1 -0
  125. dw/server/ui/assets/java-BEtHBSE6.js +1 -0
  126. dw/server/ui/assets/javascript-BJqN9Qhv.js +1 -0
  127. dw/server/ui/assets/json.worker-B2V3pomh.js +62 -0
  128. dw/server/ui/assets/jsonMode-DbM4SWSv.js +7 -0
  129. dw/server/ui/assets/julia-Bri6UV-V.js +1 -0
  130. dw/server/ui/assets/kotlin-BOotOW0E.js +1 -0
  131. dw/server/ui/assets/less-B9JPFI3C.js +2 -0
  132. dw/server/ui/assets/lexon-CfSJPG6W.js +1 -0
  133. dw/server/ui/assets/liquid-BWr8lEc4.js +1 -0
  134. dw/server/ui/assets/lspLanguageFeatures-C1iGuDyZ.js +4 -0
  135. dw/server/ui/assets/lua-CsQS60Ue.js +1 -0
  136. dw/server/ui/assets/m3-D-oSqn_W.js +1 -0
  137. dw/server/ui/assets/markdown-Cimd5fb3.js +1 -0
  138. dw/server/ui/assets/mdx-DAdMi_0p.js +1 -0
  139. dw/server/ui/assets/mips-CIPQ_RoX.js +1 -0
  140. dw/server/ui/assets/monaco--ixms01u.css +1 -0
  141. dw/server/ui/assets/monaco-BGCeEqaw.js +56 -0
  142. dw/server/ui/assets/msdax-DauUninz.js +1 -0
  143. dw/server/ui/assets/mysql-SOo6toE5.js +1 -0
  144. dw/server/ui/assets/objective-c-FvmIjYaQ.js +1 -0
  145. dw/server/ui/assets/pascal-DrH0SRf2.js +1 -0
  146. dw/server/ui/assets/pascaligo-D-ptJ9y-.js +1 -0
  147. dw/server/ui/assets/perl-oz_6vUea.js +1 -0
  148. dw/server/ui/assets/pgsql-DTj74zXo.js +1 -0
  149. dw/server/ui/assets/php-nr791fC2.js +1 -0
  150. dw/server/ui/assets/pla-CopQ2nXW.js +1 -0
  151. dw/server/ui/assets/postiats-43DmfD33.js +1 -0
  152. dw/server/ui/assets/powerquery-D3hlyOfw.js +1 -0
  153. dw/server/ui/assets/powershell-DmHpPYUd.js +1 -0
  154. dw/server/ui/assets/protobuf-C531GsRP.js +2 -0
  155. dw/server/ui/assets/pug-Z5eAx3Zn.js +1 -0
  156. dw/server/ui/assets/python-Bcn70HdC.js +1 -0
  157. dw/server/ui/assets/qsharp-DkqhCAOL.js +1 -0
  158. dw/server/ui/assets/r-BwWrilGY.js +1 -0
  159. dw/server/ui/assets/razor-D1HmNnby.js +1 -0
  160. dw/server/ui/assets/redis-ClamHrr6.js +1 -0
  161. dw/server/ui/assets/redshift-DT7zqm-g.js +1 -0
  162. dw/server/ui/assets/restructuredtext-BYgofb2h.js +1 -0
  163. dw/server/ui/assets/ruby-DezsRK8O.js +1 -0
  164. dw/server/ui/assets/rust-DdL9SqIa.js +1 -0
  165. dw/server/ui/assets/sb-CcwsVR0C.js +1 -0
  166. dw/server/ui/assets/scala-DHpiXF5c.js +1 -0
  167. dw/server/ui/assets/scheme-BeGwcela.js +1 -0
  168. dw/server/ui/assets/scss-gp-XZpBa.js +3 -0
  169. dw/server/ui/assets/shell-CC2rA5mh.js +1 -0
  170. dw/server/ui/assets/solidity-BEEn4gHE.js +1 -0
  171. dw/server/ui/assets/sophia-CRfGWb83.js +1 -0
  172. dw/server/ui/assets/sparql-D_Lu-MrJ.js +1 -0
  173. dw/server/ui/assets/sql-NEE52Syq.js +1 -0
  174. dw/server/ui/assets/st-DbInun42.js +1 -0
  175. dw/server/ui/assets/swift-Bxkupp3x.js +1 -0
  176. dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +1 -0
  177. dw/server/ui/assets/tcl-DISqw1ZD.js +1 -0
  178. dw/server/ui/assets/ts.worker-D7T1-Ig5.js +67738 -0
  179. dw/server/ui/assets/tsMode-D6u0XmOW.js +11 -0
  180. dw/server/ui/assets/twig-De2hgUGE.js +1 -0
  181. dw/server/ui/assets/typescript-BU6v-LMV.js +1 -0
  182. dw/server/ui/assets/typespec-B8J7ngcE.js +1 -0
  183. dw/server/ui/assets/vb-DV3o63ZY.js +1 -0
  184. dw/server/ui/assets/wgsl-DpFanUEy.js +298 -0
  185. dw/server/ui/assets/workers-Cn7cTUKr.js +1 -0
  186. dw/server/ui/assets/xml--0LP2Lwk.js +1 -0
  187. dw/server/ui/assets/yaml-mpBg9jnt.js +1 -0
  188. dw/server/ui/index.html +17 -0
  189. dw/server/updater.py +192 -0
  190. dw/settings.py +98 -0
  191. dw/shot_span_preflight.py +116 -0
  192. dw/shots.py +359 -0
  193. dw/slice_preflight.py +148 -0
  194. dw/step.py +187 -0
  195. dw/step_cache.py +442 -0
  196. dw/subfolders.py +107 -0
  197. dw/task_domains.py +307 -0
  198. dw/tasks/assess.py +826 -0
  199. dw/tasks/audio_transcription.py +88 -0
  200. dw/tasks/audio_utils.py +1862 -0
  201. dw/tasks/background_remover.py +43 -0
  202. dw/tasks/borders.py +113 -0
  203. dw/tasks/compose_text.py +74 -0
  204. dw/tasks/concat_videos.py +300 -0
  205. dw/tasks/depth_estimator.py +54 -0
  206. dw/tasks/diffusion_upscale.py +109 -0
  207. dw/tasks/dissolve_videos.py +342 -0
  208. dw/tasks/format_messages.py +24 -0
  209. dw/tasks/gather.py +173 -0
  210. dw/tasks/grade.py +97 -0
  211. dw/tasks/image_to_text.py +43 -0
  212. dw/tasks/image_utils.py +764 -0
  213. dw/tasks/interpolate_frames.py +252 -0
  214. dw/tasks/judge.py +68 -0
  215. dw/tasks/model_cache.py +55 -0
  216. dw/tasks/pair_audio.py +268 -0
  217. dw/tasks/qr_code.py +19 -0
  218. dw/tasks/restore_faces.py +175 -0
  219. dw/tasks/rife_model.py +192 -0
  220. dw/tasks/segment.py +121 -0
  221. dw/tasks/select.py +111 -0
  222. dw/tasks/speech_generation.py +228 -0
  223. dw/tasks/stabilize.py +129 -0
  224. dw/tasks/task.py +920 -0
  225. dw/tasks/tensor_image.py +57 -0
  226. dw/tasks/text_generation.py +169 -0
  227. dw/tasks/text_sections.py +80 -0
  228. dw/tasks/upscale.py +203 -0
  229. dw/tasks/video_utils.py +624 -0
  230. dw/tasks/zoe_depth.py +71 -0
  231. dw/teacache.py +381 -0
  232. dw/teacache_models.json +99 -0
  233. dw/test.py +29 -0
  234. dw/type_helpers.py +231 -0
  235. dw/validate.py +68 -0
  236. dw/variable_constraints.py +444 -0
  237. dw/variables.py +443 -0
  238. dw/video_extensions.py +141 -0
  239. dw/vram_estimate.py +116 -0
  240. dw/worker.py +764 -0
  241. dw/workflow.py +2007 -0
  242. dw/workflow_schema.json +1346 -0
  243. dw/workflow_sources.py +383 -0
  244. dw/workflows/h3_context_ir.json +57 -0
  245. dw/workflows/test.json +31 -0
  246. dw/workspace.py +730 -0
  247. dw_mcp/__init__.py +6 -0
  248. dw_mcp/__main__.py +133 -0
  249. dw_mcp/assets.py +336 -0
  250. dw_mcp/authoring.py +114 -0
  251. dw_mcp/catalog.py +360 -0
  252. dw_mcp/client.py +486 -0
  253. dw_mcp/diagnose.py +371 -0
  254. dw_mcp/exports.py +84 -0
  255. dw_mcp/guides.py +35 -0
  256. dw_mcp/media.py +638 -0
  257. dw_mcp/models.py +97 -0
  258. dw_mcp/prompts.py +104 -0
  259. dw_mcp/server.py +1343 -0
  260. dw_mcp/workspaces.py +212 -0
@@ -0,0 +1,237 @@
1
+ import logging
2
+ import torch
3
+
4
+ from .. import resolve_device
5
+
6
+ logger = logging.getLogger("dw")
7
+
8
+
9
+ def get_quantization_configuration(configuration):
10
+ """
11
+ Get the appropriate quantization configuration based on the input configuration.
12
+
13
+ Args:
14
+ configuration: Dictionary containing quantization settings
15
+
16
+ Returns:
17
+ Quantization configuration object or None if no valid configuration found
18
+ """
19
+ logger.debug(f"Processing quantization configuration: {configuration}")
20
+
21
+ quantization_config = configuration.get("quantization_config", None)
22
+ if quantization_config is None:
23
+ logger.debug("No quantization configuration found")
24
+ return None
25
+
26
+ return create_quantization_config(quantization_config)
27
+
28
+
29
+ def create_quantization_config(quantization_config):
30
+ """
31
+ Create a quantization configuration object from its definition.
32
+
33
+ Args:
34
+ quantization_config: Dictionary holding the config type and its arguments
35
+
36
+ Returns:
37
+ Quantization configuration object
38
+ """
39
+ logger.info("Loading quantization configuration...")
40
+ logger.debug(f"Quantization parameters: {quantization_config}")
41
+ try:
42
+ quantization_config_type = quantization_config["configuration"]["config_type"]
43
+ # Some quantization configs (e.g. TorchAoConfig) require argument values
44
+ # to be instances rather than classes. realize_args converts *_type keys to
45
+ # classes; instantiate them here with no args so callers can write e.g.
46
+ # "quant_type": "torchao.quantization.Int8WeightOnlyConfig" in JSON.
47
+ args = {
48
+ k: v() if isinstance(v, type) else v
49
+ for k, v in quantization_config["arguments"].items()
50
+ }
51
+ return quantization_config_type(**args)
52
+ except Exception as e:
53
+ logger.error(f"Failed to create quantization_config: {str(e)}", exc_info=True)
54
+ raise
55
+
56
+
57
+ def get_load_components_arguments(configuration):
58
+ """
59
+ Get the arguments for a modular pipeline's load_components(), with any quantization
60
+ configurations built from their definitions.
61
+
62
+ load_components() hands its arguments to each component's from_pretrained, looking a
63
+ dict value up under the component's own name - so quantization is declared per
64
+ component, and a component the map does not name is loaded unquantized.
65
+
66
+ Args:
67
+ configuration: Pipeline configuration dictionary
68
+
69
+ Returns:
70
+ Dictionary of arguments for load_components(), or None when the pipeline does not
71
+ load its components separately
72
+ """
73
+ load_components_arguments = configuration.get("load_components", None)
74
+ if load_components_arguments is None:
75
+ return None
76
+
77
+ load_components_arguments = dict(load_components_arguments)
78
+ quantization_configs = load_components_arguments.get("quantization_config", None)
79
+ if quantization_configs is not None:
80
+ logger.debug(
81
+ f"Building quantization configurations for: {list(quantization_configs.keys())}"
82
+ )
83
+ load_components_arguments["quantization_config"] = {
84
+ component_name: create_quantization_config(definition)
85
+ for component_name, definition in quantization_configs.items()
86
+ }
87
+
88
+ return load_components_arguments
89
+
90
+
91
+ def get_group_offload_configuration(configuration, default_device):
92
+ """
93
+ Get the appropriate group offload configuration based on the input configuration.
94
+
95
+ Args:
96
+ configuration: Dictionary containing group offload settings
97
+
98
+ Returns:
99
+ Group offload configuration object or None if no valid configuration found
100
+ https://huggingface.co/docs/diffusers/optimization/memory#group-offloading
101
+ """
102
+ logger.debug(f"Processing group offload configuration: {configuration}")
103
+
104
+ group_offload_config = configuration.get("group_offload", None)
105
+ if group_offload_config is not None:
106
+ logger.info("Loading group offload configuration...")
107
+ logger.debug(f"Group offload parameters: {group_offload_config}")
108
+ # replace device references with device objects
109
+ group_offload_config["onload_device"] = torch.device(
110
+ resolve_device(group_offload_config.get("onload_device", default_device))
111
+ )
112
+ group_offload_config["offload_device"] = torch.device(
113
+ resolve_device(group_offload_config.get("offload_device", "cpu"))
114
+ )
115
+
116
+ return group_offload_config
117
+
118
+ logger.debug("No group offload configuration found")
119
+ return None
120
+
121
+
122
+ def _resolve_mag_ratios(mag_ratios):
123
+ """Resolve a mag_ratios declaration into what MagCacheConfig accepts.
124
+
125
+ The ratios are checkpoint-dependent, so a workflow either spells them out as
126
+ a per-step array or names one of the presets diffusers ships in
127
+ diffusers.hooks.mag_cache - "flux" resolving to FLUX_MAG_RATIOS. The lookup
128
+ is dynamic, so a preset added by a later diffusers release works here with no
129
+ change, the same way quantization config_type does.
130
+
131
+ Args:
132
+ mag_ratios: A preset name, or a list of per-step ratios
133
+
134
+ Returns:
135
+ The ratios to hand to MagCacheConfig
136
+ """
137
+ if not isinstance(mag_ratios, str):
138
+ return mag_ratios
139
+
140
+ from diffusers.hooks import mag_cache
141
+
142
+ ratios = getattr(mag_cache, f"{mag_ratios.upper()}_MAG_RATIOS", None)
143
+ if ratios is None:
144
+ available = sorted(
145
+ name.removesuffix("_MAG_RATIOS").lower()
146
+ for name in dir(mag_cache)
147
+ if name.endswith("_MAG_RATIOS")
148
+ )
149
+ raise ValueError(
150
+ f"Unknown mag_ratios preset: {mag_ratios}. "
151
+ f"Available presets: {available}. "
152
+ f"A list of per-step ratios can be given instead."
153
+ )
154
+ return ratios
155
+
156
+
157
+ # Arguments each cache type forwards to its diffusers config, when present.
158
+ # Anything omitted keeps the diffusers default.
159
+ _MAG_CACHE_KEYS = (
160
+ "threshold",
161
+ "num_inference_steps",
162
+ "max_skip_steps",
163
+ "retention_ratio",
164
+ "calibrate",
165
+ )
166
+ _TAYLORSEER_CACHE_KEYS = ("cache_interval", "max_order")
167
+
168
+
169
+ def get_cache_configuration(configuration):
170
+ """
171
+ Get the appropriate diffusers cache configuration based on the input configuration.
172
+
173
+ Args:
174
+ configuration: Dictionary containing cache settings
175
+
176
+ Returns:
177
+ Cache configuration object or None if no valid configuration found
178
+ """
179
+ logger.debug(f"Processing cache configuration: {configuration}")
180
+
181
+ cache_config = configuration.get("cache", None)
182
+ if cache_config is not None:
183
+ # Imported here rather than at module scope - the cache configs live in
184
+ # diffusers.hooks, which drags in peft (~2s) every startup otherwise
185
+ from diffusers import (
186
+ FirstBlockCacheConfig,
187
+ FasterCacheConfig,
188
+ MagCacheConfig,
189
+ TaylorSeerCacheConfig,
190
+ TextKVCacheConfig,
191
+ )
192
+
193
+ logger.info("Loading cache configuration...")
194
+ logger.debug(f"Cache parameters: {cache_config}")
195
+ try:
196
+ cache_type = cache_config["type"]
197
+
198
+ if cache_type == "first_block":
199
+ config = FirstBlockCacheConfig(
200
+ threshold=cache_config.get("threshold", 0.05),
201
+ )
202
+ elif cache_type == "faster":
203
+ config = FasterCacheConfig()
204
+ elif cache_type == "text_kv":
205
+ config = TextKVCacheConfig()
206
+ elif cache_type == "mag":
207
+ kwargs = {
208
+ key: cache_config[key]
209
+ for key in _MAG_CACHE_KEYS
210
+ if key in cache_config
211
+ }
212
+ # Checkpoint-dependent, and required unless calibrating - without
213
+ # forwarding it MagCacheConfig rejects every configuration
214
+ if "mag_ratios" in cache_config:
215
+ kwargs["mag_ratios"] = _resolve_mag_ratios(
216
+ cache_config["mag_ratios"]
217
+ )
218
+ config = MagCacheConfig(**kwargs)
219
+ elif cache_type == "taylorseer":
220
+ kwargs = {
221
+ key: cache_config[key]
222
+ for key in _TAYLORSEER_CACHE_KEYS
223
+ if key in cache_config
224
+ }
225
+ config = TaylorSeerCacheConfig(**kwargs)
226
+ else:
227
+ raise ValueError(f"Unknown cache type: {cache_type}")
228
+
229
+ return config
230
+ except Exception as e:
231
+ logger.error(
232
+ f"Failed to create cache configuration: {str(e)}", exc_info=True
233
+ )
234
+ raise
235
+
236
+ logger.debug("No cache configuration found")
237
+ return None