@synsci/cli-darwin-x64 1.1.49
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.
- package/bin/skills/accelerate/SKILL.md +332 -0
- package/bin/skills/accelerate/references/custom-plugins.md +453 -0
- package/bin/skills/accelerate/references/megatron-integration.md +489 -0
- package/bin/skills/accelerate/references/performance.md +525 -0
- package/bin/skills/audiocraft/SKILL.md +564 -0
- package/bin/skills/audiocraft/references/advanced-usage.md +666 -0
- package/bin/skills/audiocraft/references/troubleshooting.md +504 -0
- package/bin/skills/autogpt/SKILL.md +403 -0
- package/bin/skills/autogpt/references/advanced-usage.md +535 -0
- package/bin/skills/autogpt/references/troubleshooting.md +420 -0
- package/bin/skills/awq/SKILL.md +310 -0
- package/bin/skills/awq/references/advanced-usage.md +324 -0
- package/bin/skills/awq/references/troubleshooting.md +344 -0
- package/bin/skills/axolotl/SKILL.md +158 -0
- package/bin/skills/axolotl/references/api.md +5548 -0
- package/bin/skills/axolotl/references/dataset-formats.md +1029 -0
- package/bin/skills/axolotl/references/index.md +15 -0
- package/bin/skills/axolotl/references/other.md +3563 -0
- package/bin/skills/bigcode-evaluation-harness/SKILL.md +405 -0
- package/bin/skills/bigcode-evaluation-harness/references/benchmarks.md +393 -0
- package/bin/skills/bigcode-evaluation-harness/references/custom-tasks.md +424 -0
- package/bin/skills/bigcode-evaluation-harness/references/issues.md +394 -0
- package/bin/skills/bitsandbytes/SKILL.md +411 -0
- package/bin/skills/bitsandbytes/references/memory-optimization.md +521 -0
- package/bin/skills/bitsandbytes/references/qlora-training.md +521 -0
- package/bin/skills/bitsandbytes/references/quantization-formats.md +447 -0
- package/bin/skills/blip-2/SKILL.md +564 -0
- package/bin/skills/blip-2/references/advanced-usage.md +680 -0
- package/bin/skills/blip-2/references/troubleshooting.md +526 -0
- package/bin/skills/chroma/SKILL.md +406 -0
- package/bin/skills/chroma/references/integration.md +38 -0
- package/bin/skills/clip/SKILL.md +253 -0
- package/bin/skills/clip/references/applications.md +207 -0
- package/bin/skills/constitutional-ai/SKILL.md +290 -0
- package/bin/skills/crewai/SKILL.md +498 -0
- package/bin/skills/crewai/references/flows.md +438 -0
- package/bin/skills/crewai/references/tools.md +429 -0
- package/bin/skills/crewai/references/troubleshooting.md +480 -0
- package/bin/skills/deepspeed/SKILL.md +141 -0
- package/bin/skills/deepspeed/references/08.md +17 -0
- package/bin/skills/deepspeed/references/09.md +173 -0
- package/bin/skills/deepspeed/references/2020.md +378 -0
- package/bin/skills/deepspeed/references/2023.md +279 -0
- package/bin/skills/deepspeed/references/assets.md +179 -0
- package/bin/skills/deepspeed/references/index.md +35 -0
- package/bin/skills/deepspeed/references/mii.md +118 -0
- package/bin/skills/deepspeed/references/other.md +1191 -0
- package/bin/skills/deepspeed/references/tutorials.md +6554 -0
- package/bin/skills/dspy/SKILL.md +590 -0
- package/bin/skills/dspy/references/examples.md +663 -0
- package/bin/skills/dspy/references/modules.md +475 -0
- package/bin/skills/dspy/references/optimizers.md +566 -0
- package/bin/skills/faiss/SKILL.md +221 -0
- package/bin/skills/faiss/references/index_types.md +280 -0
- package/bin/skills/flash-attention/SKILL.md +367 -0
- package/bin/skills/flash-attention/references/benchmarks.md +215 -0
- package/bin/skills/flash-attention/references/transformers-integration.md +293 -0
- package/bin/skills/gguf/SKILL.md +427 -0
- package/bin/skills/gguf/references/advanced-usage.md +504 -0
- package/bin/skills/gguf/references/troubleshooting.md +442 -0
- package/bin/skills/gptq/SKILL.md +450 -0
- package/bin/skills/gptq/references/calibration.md +337 -0
- package/bin/skills/gptq/references/integration.md +129 -0
- package/bin/skills/gptq/references/troubleshooting.md +95 -0
- package/bin/skills/grpo-rl-training/README.md +97 -0
- package/bin/skills/grpo-rl-training/SKILL.md +572 -0
- package/bin/skills/grpo-rl-training/examples/reward_functions_library.py +393 -0
- package/bin/skills/grpo-rl-training/templates/basic_grpo_training.py +228 -0
- package/bin/skills/guidance/SKILL.md +572 -0
- package/bin/skills/guidance/references/backends.md +554 -0
- package/bin/skills/guidance/references/constraints.md +674 -0
- package/bin/skills/guidance/references/examples.md +767 -0
- package/bin/skills/hqq/SKILL.md +445 -0
- package/bin/skills/hqq/references/advanced-usage.md +528 -0
- package/bin/skills/hqq/references/troubleshooting.md +503 -0
- package/bin/skills/hugging-face-cli/SKILL.md +191 -0
- package/bin/skills/hugging-face-cli/references/commands.md +954 -0
- package/bin/skills/hugging-face-cli/references/examples.md +374 -0
- package/bin/skills/hugging-face-datasets/SKILL.md +547 -0
- package/bin/skills/hugging-face-datasets/examples/diverse_training_examples.json +239 -0
- package/bin/skills/hugging-face-datasets/examples/system_prompt_template.txt +196 -0
- package/bin/skills/hugging-face-datasets/examples/training_examples.json +176 -0
- package/bin/skills/hugging-face-datasets/scripts/dataset_manager.py +522 -0
- package/bin/skills/hugging-face-datasets/scripts/sql_manager.py +844 -0
- package/bin/skills/hugging-face-datasets/templates/chat.json +55 -0
- package/bin/skills/hugging-face-datasets/templates/classification.json +62 -0
- package/bin/skills/hugging-face-datasets/templates/completion.json +51 -0
- package/bin/skills/hugging-face-datasets/templates/custom.json +75 -0
- package/bin/skills/hugging-face-datasets/templates/qa.json +54 -0
- package/bin/skills/hugging-face-datasets/templates/tabular.json +81 -0
- package/bin/skills/hugging-face-evaluation/SKILL.md +656 -0
- package/bin/skills/hugging-face-evaluation/examples/USAGE_EXAMPLES.md +382 -0
- package/bin/skills/hugging-face-evaluation/examples/artificial_analysis_to_hub.py +141 -0
- package/bin/skills/hugging-face-evaluation/examples/example_readme_tables.md +135 -0
- package/bin/skills/hugging-face-evaluation/examples/metric_mapping.json +50 -0
- package/bin/skills/hugging-face-evaluation/requirements.txt +20 -0
- package/bin/skills/hugging-face-evaluation/scripts/evaluation_manager.py +1374 -0
- package/bin/skills/hugging-face-evaluation/scripts/inspect_eval_uv.py +104 -0
- package/bin/skills/hugging-face-evaluation/scripts/inspect_vllm_uv.py +317 -0
- package/bin/skills/hugging-face-evaluation/scripts/lighteval_vllm_uv.py +303 -0
- package/bin/skills/hugging-face-evaluation/scripts/run_eval_job.py +98 -0
- package/bin/skills/hugging-face-evaluation/scripts/run_vllm_eval_job.py +331 -0
- package/bin/skills/hugging-face-evaluation/scripts/test_extraction.py +206 -0
- package/bin/skills/hugging-face-jobs/SKILL.md +1041 -0
- package/bin/skills/hugging-face-jobs/index.html +216 -0
- package/bin/skills/hugging-face-jobs/references/hardware_guide.md +336 -0
- package/bin/skills/hugging-face-jobs/references/hub_saving.md +352 -0
- package/bin/skills/hugging-face-jobs/references/token_usage.md +546 -0
- package/bin/skills/hugging-face-jobs/references/troubleshooting.md +475 -0
- package/bin/skills/hugging-face-jobs/scripts/cot-self-instruct.py +718 -0
- package/bin/skills/hugging-face-jobs/scripts/finepdfs-stats.py +546 -0
- package/bin/skills/hugging-face-jobs/scripts/generate-responses.py +587 -0
- package/bin/skills/hugging-face-model-trainer/SKILL.md +711 -0
- package/bin/skills/hugging-face-model-trainer/references/gguf_conversion.md +296 -0
- package/bin/skills/hugging-face-model-trainer/references/hardware_guide.md +283 -0
- package/bin/skills/hugging-face-model-trainer/references/hub_saving.md +364 -0
- package/bin/skills/hugging-face-model-trainer/references/reliability_principles.md +371 -0
- package/bin/skills/hugging-face-model-trainer/references/trackio_guide.md +189 -0
- package/bin/skills/hugging-face-model-trainer/references/training_methods.md +150 -0
- package/bin/skills/hugging-face-model-trainer/references/training_patterns.md +203 -0
- package/bin/skills/hugging-face-model-trainer/references/troubleshooting.md +282 -0
- package/bin/skills/hugging-face-model-trainer/scripts/convert_to_gguf.py +424 -0
- package/bin/skills/hugging-face-model-trainer/scripts/dataset_inspector.py +417 -0
- package/bin/skills/hugging-face-model-trainer/scripts/estimate_cost.py +150 -0
- package/bin/skills/hugging-face-model-trainer/scripts/train_dpo_example.py +106 -0
- package/bin/skills/hugging-face-model-trainer/scripts/train_grpo_example.py +89 -0
- package/bin/skills/hugging-face-model-trainer/scripts/train_sft_example.py +122 -0
- package/bin/skills/hugging-face-paper-publisher/SKILL.md +627 -0
- package/bin/skills/hugging-face-paper-publisher/examples/example_usage.md +327 -0
- package/bin/skills/hugging-face-paper-publisher/references/quick_reference.md +216 -0
- package/bin/skills/hugging-face-paper-publisher/scripts/paper_manager.py +508 -0
- package/bin/skills/hugging-face-paper-publisher/templates/arxiv.md +299 -0
- package/bin/skills/hugging-face-paper-publisher/templates/ml-report.md +358 -0
- package/bin/skills/hugging-face-paper-publisher/templates/modern.md +319 -0
- package/bin/skills/hugging-face-paper-publisher/templates/standard.md +201 -0
- package/bin/skills/hugging-face-tool-builder/SKILL.md +115 -0
- package/bin/skills/hugging-face-tool-builder/references/baseline_hf_api.py +57 -0
- package/bin/skills/hugging-face-tool-builder/references/baseline_hf_api.sh +40 -0
- package/bin/skills/hugging-face-tool-builder/references/baseline_hf_api.tsx +57 -0
- package/bin/skills/hugging-face-tool-builder/references/find_models_by_paper.sh +230 -0
- package/bin/skills/hugging-face-tool-builder/references/hf_enrich_models.sh +96 -0
- package/bin/skills/hugging-face-tool-builder/references/hf_model_card_frontmatter.sh +188 -0
- package/bin/skills/hugging-face-tool-builder/references/hf_model_papers_auth.sh +171 -0
- package/bin/skills/hugging-face-trackio/SKILL.md +65 -0
- package/bin/skills/hugging-face-trackio/references/logging_metrics.md +206 -0
- package/bin/skills/hugging-face-trackio/references/retrieving_metrics.md +223 -0
- package/bin/skills/huggingface-tokenizers/SKILL.md +516 -0
- package/bin/skills/huggingface-tokenizers/references/algorithms.md +653 -0
- package/bin/skills/huggingface-tokenizers/references/integration.md +637 -0
- package/bin/skills/huggingface-tokenizers/references/pipeline.md +723 -0
- package/bin/skills/huggingface-tokenizers/references/training.md +565 -0
- package/bin/skills/instructor/SKILL.md +740 -0
- package/bin/skills/instructor/references/examples.md +107 -0
- package/bin/skills/instructor/references/providers.md +70 -0
- package/bin/skills/instructor/references/validation.md +606 -0
- package/bin/skills/knowledge-distillation/SKILL.md +458 -0
- package/bin/skills/knowledge-distillation/references/minillm.md +334 -0
- package/bin/skills/lambda-labs/SKILL.md +545 -0
- package/bin/skills/lambda-labs/references/advanced-usage.md +611 -0
- package/bin/skills/lambda-labs/references/troubleshooting.md +530 -0
- package/bin/skills/langchain/SKILL.md +480 -0
- package/bin/skills/langchain/references/agents.md +499 -0
- package/bin/skills/langchain/references/integration.md +562 -0
- package/bin/skills/langchain/references/rag.md +600 -0
- package/bin/skills/langsmith/SKILL.md +422 -0
- package/bin/skills/langsmith/references/advanced-usage.md +548 -0
- package/bin/skills/langsmith/references/troubleshooting.md +537 -0
- package/bin/skills/litgpt/SKILL.md +469 -0
- package/bin/skills/litgpt/references/custom-models.md +568 -0
- package/bin/skills/litgpt/references/distributed-training.md +451 -0
- package/bin/skills/litgpt/references/supported-models.md +336 -0
- package/bin/skills/litgpt/references/training-recipes.md +619 -0
- package/bin/skills/llama-cpp/SKILL.md +258 -0
- package/bin/skills/llama-cpp/references/optimization.md +89 -0
- package/bin/skills/llama-cpp/references/quantization.md +213 -0
- package/bin/skills/llama-cpp/references/server.md +125 -0
- package/bin/skills/llama-factory/SKILL.md +80 -0
- package/bin/skills/llama-factory/references/_images.md +23 -0
- package/bin/skills/llama-factory/references/advanced.md +1055 -0
- package/bin/skills/llama-factory/references/getting_started.md +349 -0
- package/bin/skills/llama-factory/references/index.md +19 -0
- package/bin/skills/llama-factory/references/other.md +31 -0
- package/bin/skills/llamaguard/SKILL.md +337 -0
- package/bin/skills/llamaindex/SKILL.md +569 -0
- package/bin/skills/llamaindex/references/agents.md +83 -0
- package/bin/skills/llamaindex/references/data_connectors.md +108 -0
- package/bin/skills/llamaindex/references/query_engines.md +406 -0
- package/bin/skills/llava/SKILL.md +304 -0
- package/bin/skills/llava/references/training.md +197 -0
- package/bin/skills/lm-evaluation-harness/SKILL.md +490 -0
- package/bin/skills/lm-evaluation-harness/references/api-evaluation.md +490 -0
- package/bin/skills/lm-evaluation-harness/references/benchmark-guide.md +488 -0
- package/bin/skills/lm-evaluation-harness/references/custom-tasks.md +602 -0
- package/bin/skills/lm-evaluation-harness/references/distributed-eval.md +519 -0
- package/bin/skills/long-context/SKILL.md +536 -0
- package/bin/skills/long-context/references/extension_methods.md +468 -0
- package/bin/skills/long-context/references/fine_tuning.md +611 -0
- package/bin/skills/long-context/references/rope.md +402 -0
- package/bin/skills/mamba/SKILL.md +260 -0
- package/bin/skills/mamba/references/architecture-details.md +206 -0
- package/bin/skills/mamba/references/benchmarks.md +255 -0
- package/bin/skills/mamba/references/training-guide.md +388 -0
- package/bin/skills/megatron-core/SKILL.md +366 -0
- package/bin/skills/megatron-core/references/benchmarks.md +249 -0
- package/bin/skills/megatron-core/references/parallelism-guide.md +404 -0
- package/bin/skills/megatron-core/references/production-examples.md +473 -0
- package/bin/skills/megatron-core/references/training-recipes.md +547 -0
- package/bin/skills/miles/SKILL.md +315 -0
- package/bin/skills/miles/references/api-reference.md +141 -0
- package/bin/skills/miles/references/troubleshooting.md +352 -0
- package/bin/skills/mlflow/SKILL.md +704 -0
- package/bin/skills/mlflow/references/deployment.md +744 -0
- package/bin/skills/mlflow/references/model-registry.md +770 -0
- package/bin/skills/mlflow/references/tracking.md +680 -0
- package/bin/skills/modal/SKILL.md +341 -0
- package/bin/skills/modal/references/advanced-usage.md +503 -0
- package/bin/skills/modal/references/troubleshooting.md +494 -0
- package/bin/skills/model-merging/SKILL.md +539 -0
- package/bin/skills/model-merging/references/evaluation.md +462 -0
- package/bin/skills/model-merging/references/examples.md +428 -0
- package/bin/skills/model-merging/references/methods.md +352 -0
- package/bin/skills/model-pruning/SKILL.md +495 -0
- package/bin/skills/model-pruning/references/wanda.md +347 -0
- package/bin/skills/moe-training/SKILL.md +526 -0
- package/bin/skills/moe-training/references/architectures.md +432 -0
- package/bin/skills/moe-training/references/inference.md +348 -0
- package/bin/skills/moe-training/references/training.md +425 -0
- package/bin/skills/nanogpt/SKILL.md +290 -0
- package/bin/skills/nanogpt/references/architecture.md +382 -0
- package/bin/skills/nanogpt/references/data.md +476 -0
- package/bin/skills/nanogpt/references/training.md +564 -0
- package/bin/skills/nemo-curator/SKILL.md +383 -0
- package/bin/skills/nemo-curator/references/deduplication.md +87 -0
- package/bin/skills/nemo-curator/references/filtering.md +102 -0
- package/bin/skills/nemo-evaluator/SKILL.md +494 -0
- package/bin/skills/nemo-evaluator/references/adapter-system.md +340 -0
- package/bin/skills/nemo-evaluator/references/configuration.md +447 -0
- package/bin/skills/nemo-evaluator/references/custom-benchmarks.md +315 -0
- package/bin/skills/nemo-evaluator/references/execution-backends.md +361 -0
- package/bin/skills/nemo-guardrails/SKILL.md +297 -0
- package/bin/skills/nnsight/SKILL.md +436 -0
- package/bin/skills/nnsight/references/README.md +78 -0
- package/bin/skills/nnsight/references/api.md +344 -0
- package/bin/skills/nnsight/references/tutorials.md +300 -0
- package/bin/skills/openrlhf/SKILL.md +249 -0
- package/bin/skills/openrlhf/references/algorithm-comparison.md +404 -0
- package/bin/skills/openrlhf/references/custom-rewards.md +530 -0
- package/bin/skills/openrlhf/references/hybrid-engine.md +287 -0
- package/bin/skills/openrlhf/references/multi-node-training.md +454 -0
- package/bin/skills/outlines/SKILL.md +652 -0
- package/bin/skills/outlines/references/backends.md +615 -0
- package/bin/skills/outlines/references/examples.md +773 -0
- package/bin/skills/outlines/references/json_generation.md +652 -0
- package/bin/skills/peft/SKILL.md +431 -0
- package/bin/skills/peft/references/advanced-usage.md +514 -0
- package/bin/skills/peft/references/troubleshooting.md +480 -0
- package/bin/skills/phoenix/SKILL.md +475 -0
- package/bin/skills/phoenix/references/advanced-usage.md +619 -0
- package/bin/skills/phoenix/references/troubleshooting.md +538 -0
- package/bin/skills/pinecone/SKILL.md +358 -0
- package/bin/skills/pinecone/references/deployment.md +181 -0
- package/bin/skills/pytorch-fsdp/SKILL.md +126 -0
- package/bin/skills/pytorch-fsdp/references/index.md +7 -0
- package/bin/skills/pytorch-fsdp/references/other.md +4249 -0
- package/bin/skills/pytorch-lightning/SKILL.md +346 -0
- package/bin/skills/pytorch-lightning/references/callbacks.md +436 -0
- package/bin/skills/pytorch-lightning/references/distributed.md +490 -0
- package/bin/skills/pytorch-lightning/references/hyperparameter-tuning.md +556 -0
- package/bin/skills/pyvene/SKILL.md +473 -0
- package/bin/skills/pyvene/references/README.md +73 -0
- package/bin/skills/pyvene/references/api.md +383 -0
- package/bin/skills/pyvene/references/tutorials.md +376 -0
- package/bin/skills/qdrant/SKILL.md +493 -0
- package/bin/skills/qdrant/references/advanced-usage.md +648 -0
- package/bin/skills/qdrant/references/troubleshooting.md +631 -0
- package/bin/skills/ray-data/SKILL.md +326 -0
- package/bin/skills/ray-data/references/integration.md +82 -0
- package/bin/skills/ray-data/references/transformations.md +83 -0
- package/bin/skills/ray-train/SKILL.md +406 -0
- package/bin/skills/ray-train/references/multi-node.md +628 -0
- package/bin/skills/rwkv/SKILL.md +260 -0
- package/bin/skills/rwkv/references/architecture-details.md +344 -0
- package/bin/skills/rwkv/references/rwkv7.md +386 -0
- package/bin/skills/rwkv/references/state-management.md +369 -0
- package/bin/skills/saelens/SKILL.md +386 -0
- package/bin/skills/saelens/references/README.md +70 -0
- package/bin/skills/saelens/references/api.md +333 -0
- package/bin/skills/saelens/references/tutorials.md +318 -0
- package/bin/skills/segment-anything/SKILL.md +500 -0
- package/bin/skills/segment-anything/references/advanced-usage.md +589 -0
- package/bin/skills/segment-anything/references/troubleshooting.md +484 -0
- package/bin/skills/sentence-transformers/SKILL.md +255 -0
- package/bin/skills/sentence-transformers/references/models.md +123 -0
- package/bin/skills/sentencepiece/SKILL.md +235 -0
- package/bin/skills/sentencepiece/references/algorithms.md +200 -0
- package/bin/skills/sentencepiece/references/training.md +304 -0
- package/bin/skills/sglang/SKILL.md +442 -0
- package/bin/skills/sglang/references/deployment.md +490 -0
- package/bin/skills/sglang/references/radix-attention.md +413 -0
- package/bin/skills/sglang/references/structured-generation.md +541 -0
- package/bin/skills/simpo/SKILL.md +219 -0
- package/bin/skills/simpo/references/datasets.md +478 -0
- package/bin/skills/simpo/references/hyperparameters.md +452 -0
- package/bin/skills/simpo/references/loss-functions.md +350 -0
- package/bin/skills/skypilot/SKILL.md +509 -0
- package/bin/skills/skypilot/references/advanced-usage.md +491 -0
- package/bin/skills/skypilot/references/troubleshooting.md +570 -0
- package/bin/skills/slime/SKILL.md +464 -0
- package/bin/skills/slime/references/api-reference.md +392 -0
- package/bin/skills/slime/references/troubleshooting.md +386 -0
- package/bin/skills/speculative-decoding/SKILL.md +467 -0
- package/bin/skills/speculative-decoding/references/lookahead.md +309 -0
- package/bin/skills/speculative-decoding/references/medusa.md +350 -0
- package/bin/skills/stable-diffusion/SKILL.md +519 -0
- package/bin/skills/stable-diffusion/references/advanced-usage.md +716 -0
- package/bin/skills/stable-diffusion/references/troubleshooting.md +555 -0
- package/bin/skills/tensorboard/SKILL.md +629 -0
- package/bin/skills/tensorboard/references/integrations.md +638 -0
- package/bin/skills/tensorboard/references/profiling.md +545 -0
- package/bin/skills/tensorboard/references/visualization.md +620 -0
- package/bin/skills/tensorrt-llm/SKILL.md +187 -0
- package/bin/skills/tensorrt-llm/references/multi-gpu.md +298 -0
- package/bin/skills/tensorrt-llm/references/optimization.md +242 -0
- package/bin/skills/tensorrt-llm/references/serving.md +470 -0
- package/bin/skills/tinker/SKILL.md +362 -0
- package/bin/skills/tinker/references/api-reference.md +168 -0
- package/bin/skills/tinker/references/getting-started.md +157 -0
- package/bin/skills/tinker/references/loss-functions.md +163 -0
- package/bin/skills/tinker/references/models-and-lora.md +139 -0
- package/bin/skills/tinker/references/recipes.md +280 -0
- package/bin/skills/tinker/references/reinforcement-learning.md +212 -0
- package/bin/skills/tinker/references/rendering.md +243 -0
- package/bin/skills/tinker/references/supervised-learning.md +232 -0
- package/bin/skills/tinker-training-cost/SKILL.md +187 -0
- package/bin/skills/tinker-training-cost/scripts/calculate_cost.py +123 -0
- package/bin/skills/torchforge/SKILL.md +433 -0
- package/bin/skills/torchforge/references/api-reference.md +327 -0
- package/bin/skills/torchforge/references/troubleshooting.md +409 -0
- package/bin/skills/torchtitan/SKILL.md +358 -0
- package/bin/skills/torchtitan/references/checkpoint.md +181 -0
- package/bin/skills/torchtitan/references/custom-models.md +258 -0
- package/bin/skills/torchtitan/references/float8.md +133 -0
- package/bin/skills/torchtitan/references/fsdp.md +126 -0
- package/bin/skills/transformer-lens/SKILL.md +346 -0
- package/bin/skills/transformer-lens/references/README.md +54 -0
- package/bin/skills/transformer-lens/references/api.md +362 -0
- package/bin/skills/transformer-lens/references/tutorials.md +339 -0
- package/bin/skills/trl-fine-tuning/SKILL.md +455 -0
- package/bin/skills/trl-fine-tuning/references/dpo-variants.md +227 -0
- package/bin/skills/trl-fine-tuning/references/online-rl.md +82 -0
- package/bin/skills/trl-fine-tuning/references/reward-modeling.md +122 -0
- package/bin/skills/trl-fine-tuning/references/sft-training.md +168 -0
- package/bin/skills/unsloth/SKILL.md +80 -0
- package/bin/skills/unsloth/references/index.md +7 -0
- package/bin/skills/unsloth/references/llms-full.md +16799 -0
- package/bin/skills/unsloth/references/llms-txt.md +12044 -0
- package/bin/skills/unsloth/references/llms.md +82 -0
- package/bin/skills/verl/SKILL.md +391 -0
- package/bin/skills/verl/references/api-reference.md +301 -0
- package/bin/skills/verl/references/troubleshooting.md +391 -0
- package/bin/skills/vllm/SKILL.md +364 -0
- package/bin/skills/vllm/references/optimization.md +226 -0
- package/bin/skills/vllm/references/quantization.md +284 -0
- package/bin/skills/vllm/references/server-deployment.md +255 -0
- package/bin/skills/vllm/references/troubleshooting.md +447 -0
- package/bin/skills/weights-and-biases/SKILL.md +590 -0
- package/bin/skills/weights-and-biases/references/artifacts.md +584 -0
- package/bin/skills/weights-and-biases/references/integrations.md +700 -0
- package/bin/skills/weights-and-biases/references/sweeps.md +847 -0
- package/bin/skills/whisper/SKILL.md +317 -0
- package/bin/skills/whisper/references/languages.md +189 -0
- package/bin/synsc +0 -0
- package/package.json +10 -0
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
# Advanced Validation Patterns
|
|
2
|
+
|
|
3
|
+
Complete guide to validation in Instructor using Pydantic.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
- Built-in Validators
|
|
7
|
+
- Custom Field Validators
|
|
8
|
+
- Model-Level Validation
|
|
9
|
+
- Complex Validation Patterns
|
|
10
|
+
- Error Handling
|
|
11
|
+
|
|
12
|
+
## Built-in Validators
|
|
13
|
+
|
|
14
|
+
### Numeric Constraints
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
from pydantic import BaseModel, Field
|
|
18
|
+
|
|
19
|
+
class Product(BaseModel):
|
|
20
|
+
price: float = Field(gt=0, description="Price must be positive")
|
|
21
|
+
discount: float = Field(ge=0, le=100, description="Discount 0-100%")
|
|
22
|
+
quantity: int = Field(ge=1, description="At least 1 item")
|
|
23
|
+
rating: float = Field(ge=0.0, le=5.0, description="Rating 0-5 stars")
|
|
24
|
+
|
|
25
|
+
# If LLM provides invalid values, automatic retry with error feedback
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Available constraints:**
|
|
29
|
+
- `gt`: Greater than
|
|
30
|
+
- `ge`: Greater than or equal
|
|
31
|
+
- `lt`: Less than
|
|
32
|
+
- `le`: Less than or equal
|
|
33
|
+
- `multiple_of`: Must be multiple of this number
|
|
34
|
+
|
|
35
|
+
### String Constraints
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
class User(BaseModel):
|
|
39
|
+
username: str = Field(
|
|
40
|
+
min_length=3,
|
|
41
|
+
max_length=20,
|
|
42
|
+
pattern=r'^[a-zA-Z0-9_]+$',
|
|
43
|
+
description="3-20 alphanumeric characters"
|
|
44
|
+
)
|
|
45
|
+
bio: str = Field(max_length=500, description="Bio up to 500 chars")
|
|
46
|
+
status: str = Field(pattern=r'^(active|inactive|pending)$')
|
|
47
|
+
|
|
48
|
+
# pattern validates against regex
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Email and URL Validation
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from pydantic import EmailStr, HttpUrl, AnyUrl
|
|
55
|
+
|
|
56
|
+
class Contact(BaseModel):
|
|
57
|
+
email: EmailStr # Validates email format
|
|
58
|
+
website: HttpUrl # Validates HTTP/HTTPS URLs
|
|
59
|
+
portfolio: AnyUrl # Any valid URL scheme
|
|
60
|
+
|
|
61
|
+
contact = client.messages.create(
|
|
62
|
+
model="claude-sonnet-4-5-20250929",
|
|
63
|
+
max_tokens=1024,
|
|
64
|
+
messages=[{
|
|
65
|
+
"role": "user",
|
|
66
|
+
"content": "Extract: john@example.com, https://example.com"
|
|
67
|
+
}],
|
|
68
|
+
response_model=Contact
|
|
69
|
+
)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Date and DateTime Validation
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
from datetime import date, datetime
|
|
76
|
+
from pydantic import Field, field_validator
|
|
77
|
+
|
|
78
|
+
class Event(BaseModel):
|
|
79
|
+
event_date: date # Validates date format
|
|
80
|
+
created_at: datetime # Validates datetime format
|
|
81
|
+
year: int = Field(ge=1900, le=2100)
|
|
82
|
+
|
|
83
|
+
@field_validator('event_date')
|
|
84
|
+
def future_date(cls, v):
|
|
85
|
+
"""Ensure event is in the future."""
|
|
86
|
+
if v < date.today():
|
|
87
|
+
raise ValueError('Event must be in the future')
|
|
88
|
+
return v
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### List and Dict Validation
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
class Document(BaseModel):
|
|
95
|
+
tags: list[str] = Field(min_length=1, max_length=10)
|
|
96
|
+
keywords: list[str] = Field(min_length=3, description="At least 3 keywords")
|
|
97
|
+
metadata: dict[str, str] = Field(description="String key-value pairs")
|
|
98
|
+
|
|
99
|
+
@field_validator('tags')
|
|
100
|
+
def unique_tags(cls, v):
|
|
101
|
+
"""Ensure tags are unique."""
|
|
102
|
+
if len(v) != len(set(v)):
|
|
103
|
+
raise ValueError('Tags must be unique')
|
|
104
|
+
return v
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Custom Field Validators
|
|
108
|
+
|
|
109
|
+
### Basic Field Validator
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
from pydantic import field_validator
|
|
113
|
+
|
|
114
|
+
class Person(BaseModel):
|
|
115
|
+
name: str
|
|
116
|
+
age: int
|
|
117
|
+
|
|
118
|
+
@field_validator('name')
|
|
119
|
+
def name_must_not_be_empty(cls, v):
|
|
120
|
+
"""Validate name is not empty or just whitespace."""
|
|
121
|
+
if not v or not v.strip():
|
|
122
|
+
raise ValueError('Name cannot be empty')
|
|
123
|
+
return v.strip()
|
|
124
|
+
|
|
125
|
+
@field_validator('age')
|
|
126
|
+
def age_must_be_reasonable(cls, v):
|
|
127
|
+
"""Validate age is between 0 and 120."""
|
|
128
|
+
if v < 0 or v > 120:
|
|
129
|
+
raise ValueError('Age must be between 0 and 120')
|
|
130
|
+
return v
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Validator with Field Info
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
from pydantic import ValidationInfo
|
|
137
|
+
|
|
138
|
+
class Article(BaseModel):
|
|
139
|
+
title: str
|
|
140
|
+
content: str
|
|
141
|
+
|
|
142
|
+
@field_validator('content')
|
|
143
|
+
def content_length(cls, v, info: ValidationInfo):
|
|
144
|
+
"""Validate content is longer than title."""
|
|
145
|
+
if 'title' in info.data:
|
|
146
|
+
title_len = len(info.data['title'])
|
|
147
|
+
if len(v) < title_len * 2:
|
|
148
|
+
raise ValueError('Content should be at least 2x title length')
|
|
149
|
+
return v
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Multiple Fields Validation
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
class TimeRange(BaseModel):
|
|
156
|
+
start_time: str
|
|
157
|
+
end_time: str
|
|
158
|
+
|
|
159
|
+
@field_validator('start_time', 'end_time')
|
|
160
|
+
def valid_time_format(cls, v):
|
|
161
|
+
"""Validate both times are in HH:MM format."""
|
|
162
|
+
import re
|
|
163
|
+
if not re.match(r'^\d{2}:\d{2}$', v):
|
|
164
|
+
raise ValueError('Time must be in HH:MM format')
|
|
165
|
+
return v
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Transform and Validate
|
|
169
|
+
|
|
170
|
+
```python
|
|
171
|
+
class URL(BaseModel):
|
|
172
|
+
url: str
|
|
173
|
+
|
|
174
|
+
@field_validator('url')
|
|
175
|
+
def normalize_url(cls, v):
|
|
176
|
+
"""Add https:// if missing."""
|
|
177
|
+
if not v.startswith(('http://', 'https://')):
|
|
178
|
+
v = f'https://{v}'
|
|
179
|
+
return v
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Model-Level Validation
|
|
183
|
+
|
|
184
|
+
### Cross-Field Validation
|
|
185
|
+
|
|
186
|
+
```python
|
|
187
|
+
from pydantic import model_validator
|
|
188
|
+
|
|
189
|
+
class DateRange(BaseModel):
|
|
190
|
+
start_date: str
|
|
191
|
+
end_date: str
|
|
192
|
+
|
|
193
|
+
@model_validator(mode='after')
|
|
194
|
+
def check_dates(self):
|
|
195
|
+
"""Ensure end_date is after start_date."""
|
|
196
|
+
from datetime import datetime
|
|
197
|
+
start = datetime.strptime(self.start_date, '%Y-%m-%d')
|
|
198
|
+
end = datetime.strptime(self.end_date, '%Y-%m-%d')
|
|
199
|
+
|
|
200
|
+
if end < start:
|
|
201
|
+
raise ValueError('end_date must be after start_date')
|
|
202
|
+
return self
|
|
203
|
+
|
|
204
|
+
class PriceRange(BaseModel):
|
|
205
|
+
min_price: float
|
|
206
|
+
max_price: float
|
|
207
|
+
|
|
208
|
+
@model_validator(mode='after')
|
|
209
|
+
def check_price_range(self):
|
|
210
|
+
"""Ensure max > min."""
|
|
211
|
+
if self.max_price <= self.min_price:
|
|
212
|
+
raise ValueError('max_price must be greater than min_price')
|
|
213
|
+
return self
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Conditional Validation
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
class Order(BaseModel):
|
|
220
|
+
order_type: str # "standard" or "express"
|
|
221
|
+
delivery_date: str
|
|
222
|
+
delivery_time: Optional[str] = None
|
|
223
|
+
|
|
224
|
+
@model_validator(mode='after')
|
|
225
|
+
def check_delivery_time(self):
|
|
226
|
+
"""Express orders need delivery time."""
|
|
227
|
+
if self.order_type == "express" and not self.delivery_time:
|
|
228
|
+
raise ValueError('Express orders require delivery_time')
|
|
229
|
+
return self
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Complex Business Logic
|
|
233
|
+
|
|
234
|
+
```python
|
|
235
|
+
class Discount(BaseModel):
|
|
236
|
+
code: str
|
|
237
|
+
percentage: float = Field(ge=0, le=100)
|
|
238
|
+
min_purchase: float = Field(ge=0)
|
|
239
|
+
max_discount: float = Field(ge=0)
|
|
240
|
+
|
|
241
|
+
@model_validator(mode='after')
|
|
242
|
+
def validate_discount(self):
|
|
243
|
+
"""Ensure discount logic is sound."""
|
|
244
|
+
# Max discount can't exceed percentage of min_purchase
|
|
245
|
+
theoretical_max = (self.percentage / 100) * self.min_purchase
|
|
246
|
+
if self.max_discount > theoretical_max:
|
|
247
|
+
self.max_discount = theoretical_max
|
|
248
|
+
return self
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Complex Validation Patterns
|
|
252
|
+
|
|
253
|
+
### Nested Model Validation
|
|
254
|
+
|
|
255
|
+
```python
|
|
256
|
+
class Address(BaseModel):
|
|
257
|
+
street: str
|
|
258
|
+
city: str
|
|
259
|
+
country: str
|
|
260
|
+
postal_code: str
|
|
261
|
+
|
|
262
|
+
@field_validator('postal_code')
|
|
263
|
+
def validate_postal_code(cls, v, info: ValidationInfo):
|
|
264
|
+
"""Validate postal code format based on country."""
|
|
265
|
+
if 'country' in info.data:
|
|
266
|
+
country = info.data['country']
|
|
267
|
+
if country == "USA":
|
|
268
|
+
import re
|
|
269
|
+
if not re.match(r'^\d{5}(-\d{4})?$', v):
|
|
270
|
+
raise ValueError('Invalid US postal code')
|
|
271
|
+
elif country == "Canada":
|
|
272
|
+
if not re.match(r'^[A-Z]\d[A-Z] \d[A-Z]\d$', v):
|
|
273
|
+
raise ValueError('Invalid Canadian postal code')
|
|
274
|
+
return v
|
|
275
|
+
|
|
276
|
+
class Person(BaseModel):
|
|
277
|
+
name: str
|
|
278
|
+
address: Address
|
|
279
|
+
|
|
280
|
+
# Nested validation runs automatically
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### List of Models
|
|
284
|
+
|
|
285
|
+
```python
|
|
286
|
+
class Task(BaseModel):
|
|
287
|
+
title: str = Field(min_length=1)
|
|
288
|
+
priority: int = Field(ge=1, le=5)
|
|
289
|
+
|
|
290
|
+
class Project(BaseModel):
|
|
291
|
+
name: str
|
|
292
|
+
tasks: list[Task] = Field(min_length=1, description="At least 1 task")
|
|
293
|
+
|
|
294
|
+
@field_validator('tasks')
|
|
295
|
+
def at_least_one_high_priority(cls, v):
|
|
296
|
+
"""Ensure at least one task has priority >= 4."""
|
|
297
|
+
if not any(task.priority >= 4 for task in v):
|
|
298
|
+
raise ValueError('Project needs at least one high-priority task')
|
|
299
|
+
return v
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Union Type Validation
|
|
303
|
+
|
|
304
|
+
```python
|
|
305
|
+
from typing import Union
|
|
306
|
+
|
|
307
|
+
class TextBlock(BaseModel):
|
|
308
|
+
type: str = "text"
|
|
309
|
+
content: str = Field(min_length=1)
|
|
310
|
+
|
|
311
|
+
class ImageBlock(BaseModel):
|
|
312
|
+
type: str = "image"
|
|
313
|
+
url: HttpUrl
|
|
314
|
+
alt_text: str
|
|
315
|
+
|
|
316
|
+
class Page(BaseModel):
|
|
317
|
+
title: str
|
|
318
|
+
blocks: list[Union[TextBlock, ImageBlock]]
|
|
319
|
+
|
|
320
|
+
@field_validator('blocks')
|
|
321
|
+
def validate_block_types(cls, v):
|
|
322
|
+
"""Ensure first block is TextBlock."""
|
|
323
|
+
if v and not isinstance(v[0], TextBlock):
|
|
324
|
+
raise ValueError('First block must be text')
|
|
325
|
+
return v
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Dependent Fields
|
|
329
|
+
|
|
330
|
+
```python
|
|
331
|
+
class Subscription(BaseModel):
|
|
332
|
+
plan: str # "free", "pro", "enterprise"
|
|
333
|
+
max_users: int
|
|
334
|
+
features: list[str]
|
|
335
|
+
|
|
336
|
+
@model_validator(mode='after')
|
|
337
|
+
def validate_plan_limits(self):
|
|
338
|
+
"""Enforce plan-specific limits."""
|
|
339
|
+
limits = {
|
|
340
|
+
"free": {"max_users": 1, "required_features": ["basic"]},
|
|
341
|
+
"pro": {"max_users": 10, "required_features": ["basic", "advanced"]},
|
|
342
|
+
"enterprise": {"max_users": 999, "required_features": ["basic", "advanced", "premium"]}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if self.plan in limits:
|
|
346
|
+
limit = limits[self.plan]
|
|
347
|
+
|
|
348
|
+
if self.max_users > limit["max_users"]:
|
|
349
|
+
raise ValueError(f'{self.plan} plan limited to {limit["max_users"]} users')
|
|
350
|
+
|
|
351
|
+
for feature in limit["required_features"]:
|
|
352
|
+
if feature not in self.features:
|
|
353
|
+
raise ValueError(f'{self.plan} plan requires {feature} feature')
|
|
354
|
+
|
|
355
|
+
return self
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## Error Handling
|
|
359
|
+
|
|
360
|
+
### Graceful Degradation
|
|
361
|
+
|
|
362
|
+
```python
|
|
363
|
+
class OptionalExtraction(BaseModel):
|
|
364
|
+
# Required fields
|
|
365
|
+
title: str
|
|
366
|
+
|
|
367
|
+
# Optional fields with defaults
|
|
368
|
+
author: Optional[str] = None
|
|
369
|
+
date: Optional[str] = None
|
|
370
|
+
tags: list[str] = Field(default_factory=list)
|
|
371
|
+
|
|
372
|
+
# LLM can succeed even if it can't extract everything
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### Partial Validation
|
|
376
|
+
|
|
377
|
+
```python
|
|
378
|
+
from pydantic import ValidationError
|
|
379
|
+
|
|
380
|
+
def extract_with_fallback(text: str):
|
|
381
|
+
"""Try full extraction, fall back to partial."""
|
|
382
|
+
try:
|
|
383
|
+
# Try full extraction
|
|
384
|
+
return client.messages.create(
|
|
385
|
+
model="claude-sonnet-4-5-20250929",
|
|
386
|
+
max_tokens=1024,
|
|
387
|
+
messages=[{"role": "user", "content": text}],
|
|
388
|
+
response_model=FullModel
|
|
389
|
+
)
|
|
390
|
+
except ValidationError:
|
|
391
|
+
# Fall back to partial model
|
|
392
|
+
return client.messages.create(
|
|
393
|
+
model="claude-sonnet-4-5-20250929",
|
|
394
|
+
max_tokens=1024,
|
|
395
|
+
messages=[{"role": "user", "content": text}],
|
|
396
|
+
response_model=PartialModel
|
|
397
|
+
)
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Validation Error Inspection
|
|
401
|
+
|
|
402
|
+
```python
|
|
403
|
+
from pydantic import ValidationError
|
|
404
|
+
|
|
405
|
+
try:
|
|
406
|
+
result = client.messages.create(
|
|
407
|
+
model="claude-sonnet-4-5-20250929",
|
|
408
|
+
max_tokens=1024,
|
|
409
|
+
messages=[...],
|
|
410
|
+
response_model=MyModel,
|
|
411
|
+
max_retries=3
|
|
412
|
+
)
|
|
413
|
+
except ValidationError as e:
|
|
414
|
+
# Inspect specific errors
|
|
415
|
+
for error in e.errors():
|
|
416
|
+
field = error['loc'][0]
|
|
417
|
+
message = error['msg']
|
|
418
|
+
print(f"Field '{field}' failed: {message}")
|
|
419
|
+
|
|
420
|
+
# Custom handling per field
|
|
421
|
+
if field == 'email':
|
|
422
|
+
# Handle email validation failure
|
|
423
|
+
pass
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### Custom Error Messages
|
|
427
|
+
|
|
428
|
+
```python
|
|
429
|
+
class DetailedModel(BaseModel):
|
|
430
|
+
name: str = Field(
|
|
431
|
+
min_length=2,
|
|
432
|
+
max_length=100,
|
|
433
|
+
description="Name between 2-100 characters"
|
|
434
|
+
)
|
|
435
|
+
age: int = Field(
|
|
436
|
+
ge=0,
|
|
437
|
+
le=120,
|
|
438
|
+
description="Age between 0 and 120 years"
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
@field_validator('name')
|
|
442
|
+
def validate_name(cls, v):
|
|
443
|
+
"""Provide helpful error message."""
|
|
444
|
+
if not v.strip():
|
|
445
|
+
raise ValueError(
|
|
446
|
+
'Name cannot be empty. '
|
|
447
|
+
'Please provide a valid name from the text.'
|
|
448
|
+
)
|
|
449
|
+
return v
|
|
450
|
+
|
|
451
|
+
# When validation fails, LLM sees these helpful messages
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
## Validation Best Practices
|
|
455
|
+
|
|
456
|
+
### 1. Be Specific
|
|
457
|
+
|
|
458
|
+
```python
|
|
459
|
+
# ❌ Bad: Vague validation
|
|
460
|
+
class Item(BaseModel):
|
|
461
|
+
name: str
|
|
462
|
+
|
|
463
|
+
# ✅ Good: Specific constraints
|
|
464
|
+
class Item(BaseModel):
|
|
465
|
+
name: str = Field(
|
|
466
|
+
min_length=1,
|
|
467
|
+
max_length=200,
|
|
468
|
+
description="Item name, 1-200 characters"
|
|
469
|
+
)
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### 2. Provide Context
|
|
473
|
+
|
|
474
|
+
```python
|
|
475
|
+
# ✅ Good: Explain why validation failed
|
|
476
|
+
@field_validator('price')
|
|
477
|
+
def validate_price(cls, v):
|
|
478
|
+
if v <= 0:
|
|
479
|
+
raise ValueError(
|
|
480
|
+
'Price must be positive. '
|
|
481
|
+
'Extract numeric price from text without currency symbols.'
|
|
482
|
+
)
|
|
483
|
+
return v
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### 3. Use Enums for Fixed Sets
|
|
487
|
+
|
|
488
|
+
```python
|
|
489
|
+
# ❌ Bad: String validation
|
|
490
|
+
status: str
|
|
491
|
+
|
|
492
|
+
@field_validator('status')
|
|
493
|
+
def validate_status(cls, v):
|
|
494
|
+
if v not in ['active', 'inactive', 'pending']:
|
|
495
|
+
raise ValueError('Invalid status')
|
|
496
|
+
return v
|
|
497
|
+
|
|
498
|
+
# ✅ Good: Enum
|
|
499
|
+
class Status(str, Enum):
|
|
500
|
+
ACTIVE = "active"
|
|
501
|
+
INACTIVE = "inactive"
|
|
502
|
+
PENDING = "pending"
|
|
503
|
+
|
|
504
|
+
status: Status # Validation automatic
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### 4. Balance Strictness
|
|
508
|
+
|
|
509
|
+
```python
|
|
510
|
+
# Too strict: May fail unnecessarily
|
|
511
|
+
class StrictModel(BaseModel):
|
|
512
|
+
date: str = Field(pattern=r'^\d{4}-\d{2}-\d{2}$')
|
|
513
|
+
# Fails if LLM uses "2024-1-5" instead of "2024-01-05"
|
|
514
|
+
|
|
515
|
+
# Better: Normalize in validator
|
|
516
|
+
class FlexibleModel(BaseModel):
|
|
517
|
+
date: str
|
|
518
|
+
|
|
519
|
+
@field_validator('date')
|
|
520
|
+
def normalize_date(cls, v):
|
|
521
|
+
from datetime import datetime
|
|
522
|
+
# Parse flexible formats
|
|
523
|
+
for fmt in ['%Y-%m-%d', '%Y/%m/%d', '%m/%d/%Y']:
|
|
524
|
+
try:
|
|
525
|
+
dt = datetime.strptime(v, fmt)
|
|
526
|
+
return dt.strftime('%Y-%m-%d') # Normalize
|
|
527
|
+
except ValueError:
|
|
528
|
+
continue
|
|
529
|
+
raise ValueError('Invalid date format')
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### 5. Test Validation
|
|
533
|
+
|
|
534
|
+
```python
|
|
535
|
+
# Test your validators with edge cases
|
|
536
|
+
def test_validation():
|
|
537
|
+
# Should succeed
|
|
538
|
+
valid = MyModel(field="valid_value")
|
|
539
|
+
|
|
540
|
+
# Should fail
|
|
541
|
+
try:
|
|
542
|
+
invalid = MyModel(field="invalid")
|
|
543
|
+
assert False, "Should have raised ValidationError"
|
|
544
|
+
except ValidationError:
|
|
545
|
+
pass # Expected
|
|
546
|
+
|
|
547
|
+
# Run tests before using in production
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
## Advanced Techniques
|
|
551
|
+
|
|
552
|
+
### Conditional Required Fields
|
|
553
|
+
|
|
554
|
+
```python
|
|
555
|
+
from typing import Optional
|
|
556
|
+
|
|
557
|
+
class ConditionalModel(BaseModel):
|
|
558
|
+
type: str
|
|
559
|
+
detail_a: Optional[str] = None
|
|
560
|
+
detail_b: Optional[str] = None
|
|
561
|
+
|
|
562
|
+
@model_validator(mode='after')
|
|
563
|
+
def check_required_details(self):
|
|
564
|
+
"""Require different fields based on type."""
|
|
565
|
+
if self.type == "type_a" and not self.detail_a:
|
|
566
|
+
raise ValueError('type_a requires detail_a')
|
|
567
|
+
if self.type == "type_b" and not self.detail_b:
|
|
568
|
+
raise ValueError('type_b requires detail_b')
|
|
569
|
+
return self
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
### Validation with External Data
|
|
573
|
+
|
|
574
|
+
```python
|
|
575
|
+
class Product(BaseModel):
|
|
576
|
+
sku: str
|
|
577
|
+
name: str
|
|
578
|
+
|
|
579
|
+
@field_validator('sku')
|
|
580
|
+
def validate_sku(cls, v):
|
|
581
|
+
"""Check SKU exists in database."""
|
|
582
|
+
# Query database or API
|
|
583
|
+
if not database.sku_exists(v):
|
|
584
|
+
raise ValueError(f'SKU {v} not found in catalog')
|
|
585
|
+
return v
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
### Progressive Validation
|
|
589
|
+
|
|
590
|
+
```python
|
|
591
|
+
# Start with loose validation
|
|
592
|
+
class Stage1(BaseModel):
|
|
593
|
+
data: str # Any string
|
|
594
|
+
|
|
595
|
+
# Then strict validation
|
|
596
|
+
class Stage2(BaseModel):
|
|
597
|
+
data: str = Field(pattern=r'^[A-Z]{3}-\d{6}$')
|
|
598
|
+
|
|
599
|
+
# Use Stage1 for initial extraction
|
|
600
|
+
# Use Stage2 for final validation
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
## Resources
|
|
604
|
+
|
|
605
|
+
- **Pydantic Docs**: https://docs.pydantic.dev/latest/concepts/validators/
|
|
606
|
+
- **Instructor Examples**: https://python.useinstructor.com/examples
|