DeepFabric 4.10.1__tar.gz → 4.11.0__tar.gz
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.
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/workflows/docs.yml +1 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/workflows/integration.yml +1 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/workflows/publish.yml +1 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/workflows/test.yml +1 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/CLAUDE.md +3 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/LICENSE +1 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/Makefile +1 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/PKG-INFO +3 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/cli.py +83 -27
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/cloud_upload.py +1 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/config.py +6 -4
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/constants.py +1 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/dataset_manager.py +264 -62
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/generator.py +687 -82
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/graph.py +25 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/llm/retry_handler.py +28 -9
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/progress.py +42 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/topic_manager.py +22 -2
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/topic_model.py +26 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/tree.py +41 -16
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/tui.py +448 -349
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/utils.py +4 -1
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/validate.md +18 -8
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/dataset-generation/basic.md +31 -20
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/dataset-generation/configuration.md +22 -9
- {deepfabric-4.10.1 → deepfabric-4.11.0}/pyproject.toml +5 -1
- deepfabric-4.11.0/tests/integration/conftest.py +111 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/integration/test_generator_integration.py +39 -40
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/integration/test_graph_integration.py +20 -31
- deepfabric-4.11.0/tests/integration/test_llm_client_integration.py +143 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/integration/test_tree_integration.py +31 -26
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_checkpoint.py +71 -56
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_cli.py +30 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_generator.py +7 -1
- deepfabric-4.11.0/tests/unit/test_tui.py +23 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/docker-compose.yaml +2 -2
- {deepfabric-4.10.1 → deepfabric-4.11.0}/uv.lock +45 -6
- deepfabric-4.10.1/tests/integration/conftest.py +0 -42
- deepfabric-4.10.1/tests/integration/test_llm_client_integration.py +0 -141
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/config.yml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/dependabot.yml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.github/workflows/tools-sdk-docker.yml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/.gitignore +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/CODE_OF_CONDUCT.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/CONTRIBUTING.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/README.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/assets/df-demo.gif +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/assets/logo-light-hols.png +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/assets/logo-light.png +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/assets/star.gif +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/coverage.xml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/__main__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/auth.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/builders.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/builders_agent.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/config_manager.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/dataset.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/error_codes.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/backends/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/backends/llm_eval_backend.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/backends/ollama_backend.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/backends/tool_call_parsers.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/backends/transformers_backend.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/evaluator.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/evaluators/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/evaluators/base.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/evaluators/builtin/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/evaluators/builtin/tool_calling.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/evaluators/registry.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/inference.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/metrics.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/parser.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/reporters/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/reporters/base.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/reporters/cloud_reporter.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/reporters/file_reporter.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/evaluation/reporters/multi_reporter.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/exceptions.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/factory.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/hf_hub.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/kaggle_hub.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/llm/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/llm/api_key_verifier.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/llm/client.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/llm/errors.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/llm/rate_limit_config.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/llm/rate_limit_detector.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/loader.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/metrics.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/prompts.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/schemas.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/spin/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/spin/client.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/spin/models.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/stream_simulator.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/tools/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/tools/defaults.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/tools/loader.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/tools/mcp_client.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/training/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/training/api_key_prompt.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/training/callback.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/training/dataset_utils.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/training/metrics_sender.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/update_checker.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/deepfabric/validation.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/evaluate.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/generate.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/import-tools.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/index.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/info.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/upload-hf.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/upload-kaggle.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/upload.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/cli/visualize.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/dataset-generation/agent.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/dataset-generation/index.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/dataset-generation/rate-limiting.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/dataset-generation/reasoning.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/evaluation/index.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/evaluation/metrics.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/evaluation/running.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/images/logo-light.png +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/images/python-spin.png +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/index.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/custom.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/index.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/mock.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/spin.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/tutorials/go.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/tutorials/index.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/tutorials/python.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/tutorials/rust.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/tutorials/typescript.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/tools/vfs.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/training/chat-templates.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/training/dataset-preparation.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/training/frameworks.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/training/index.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/docs/training/loading.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/agent-tools.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/basic-anthropic.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/basic-gemini.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/basic-graph.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/basic-ollama.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/basic-openai.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/basic-openrouter.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/basic-tree.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/coding-agent.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/complete.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/custom-tools.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/github-mock-tools.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/reasoning.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/spin-vfs-tools.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/tools-sdk-examples/blender/load-blender-mock-data.sh +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/tools-sdk-examples/blender/spin-blender.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/tools-sdk-examples/figma/load-figma-mock-data.sh +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/tools-sdk-examples/figma/spin-figma.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/tools-sdk-examples/github/load-github-mock-data.sh +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/tools-sdk-examples/github/spin-github-tools.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/tools-sdk-examples/kubernetes/load-kubernetes-mock-data.sh +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/examples/tools-sdk-examples/kubernetes/spin-kubernetes.yaml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/misc/test_update_manual.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/mkdocs.yml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/notebooks/Train_and_Evaluate_Qwen3_4B_Thinking_as_a_Blender_MCP_Agent.ipynb +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/notebooks/dataset-compatibility-check.ipynb +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/notebooks/evaluations.ipynb +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/test-run/01-alpaca.txt +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/test-run/01-chatml.txt +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/test-run/01-grpo.txt +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/test-run/01-xlam_v2.txt +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/test-run/02-trl2.txt +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/test-run/02-xlam_v2.txt +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/test-run/04-agent-tool-conversations.jsnl +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/test-run/04-single-agent-tools +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/integration/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/integration/test_spin_integration.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/__init__.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/conftest.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_api_key_validation.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_cloud_upload.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_config.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_dataset.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_error_codes.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_gemini_schema.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_hf_hub.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_kaggle_hub.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_llm_eval_backend.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_loader.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_modular_config.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_rate_limiting.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_schemas.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_tool_call_parsers.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_topic_graph.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_training_callback.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tests/unit/test_update_checker.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools/extract_messages.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools/function.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools/yaml_to_openai_tools.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/.dockerignore +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/Dockerfile +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/README.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/github/README.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/github/app.py +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/github/github.wasm +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/github/pyproject.toml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/github/requirements.txt +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/github/spin.toml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/github/uv.lock +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/mock/Cargo.lock +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/mock/Cargo.toml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/mock/README.md +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/mock/src/lib.rs +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/vfs/Cargo.lock +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/vfs/Cargo.toml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/components/vfs/src/lib.rs +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/runtime-config.toml +0 -0
- {deepfabric-4.10.1 → deepfabric-4.11.0}/tools-sdk/spin.toml +0 -0
|
@@ -23,7 +23,7 @@ jobs:
|
|
|
23
23
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5
|
|
24
24
|
|
|
25
25
|
- name: Install uv
|
|
26
|
-
uses: astral-sh/setup-uv@
|
|
26
|
+
uses: astral-sh/setup-uv@803947b9bd8e9f986429fa0c5a41c367cd732b41 # v7
|
|
27
27
|
|
|
28
28
|
- name: Set up Python
|
|
29
29
|
run: uv python install
|
|
@@ -22,7 +22,7 @@ jobs:
|
|
|
22
22
|
python-version: ${{ matrix.python-version }}
|
|
23
23
|
|
|
24
24
|
- name: Install uv
|
|
25
|
-
uses: astral-sh/setup-uv@
|
|
25
|
+
uses: astral-sh/setup-uv@803947b9bd8e9f986429fa0c5a41c367cd732b41 # v7
|
|
26
26
|
with:
|
|
27
27
|
enable-cache: true
|
|
28
28
|
|
|
@@ -59,6 +59,9 @@ The engine includes robust JSON parsing with regex extraction and retry logic fo
|
|
|
59
59
|
- Failed samples tracked separately from successful ones
|
|
60
60
|
- Comprehensive error reporting in final summary
|
|
61
61
|
|
|
62
|
+
### Topic Path Context in Generation
|
|
63
|
+
Dataset generation must always pass the **full hierarchical path** (root -> ... -> leaf) to `build_prompt()`, not just the leaf topic text. This applies to all generation modes (step-based and cycle-based). The full path provides essential context for the LLM to generate domain-specific samples. When modifying generation logic, verify that `subtopics_list` receives the complete path from `TopicModel.get_path_by_id()` or `TopicPath.path`, never just the leaf text in isolation.
|
|
64
|
+
|
|
62
65
|
### System Message Control
|
|
63
66
|
The `sys_msg` parameter controls whether system messages are included in the final dataset format - this affects training data structure.
|
|
64
67
|
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
|
187
187
|
identification within third-party archives.
|
|
188
188
|
|
|
189
|
-
Copyright 2025
|
|
189
|
+
Copyright 2025 Always Further, Inc
|
|
190
190
|
|
|
191
191
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
192
|
you may not use this file except in compliance with the License.
|
|
@@ -30,7 +30,7 @@ test-integration:
|
|
|
30
30
|
$(PYTEST_INTEGRATION) --maxfail=1
|
|
31
31
|
|
|
32
32
|
test-integration-verbose:
|
|
33
|
-
|
|
33
|
+
$(PYTEST_INTEGRATION) -s -rA --durations=10 --tb=long
|
|
34
34
|
|
|
35
35
|
test-integration-openai:
|
|
36
36
|
$(PYTEST_INTEGRATION) -m openai
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: DeepFabric
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.11.0
|
|
4
4
|
Summary: Curate High Quality Datasets, Train, Evaluate and Ship
|
|
5
5
|
Author-email: DeepFabric Team <oss@alwaysfurther.ai>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -29,9 +29,11 @@ Requires-Dist: transformers==5.0.0
|
|
|
29
29
|
Provides-Extra: dev
|
|
30
30
|
Requires-Dist: bandit>=1.7.10; extra == 'dev'
|
|
31
31
|
Requires-Dist: mermaid-py>=0.2.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
32
33
|
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
|
|
33
34
|
Requires-Dist: pytest-httpx>=0.30.0; extra == 'dev'
|
|
34
35
|
Requires-Dist: pytest-mock>=3.10.0; extra == 'dev'
|
|
36
|
+
Requires-Dist: pytest-rerunfailures>=14.0; extra == 'dev'
|
|
35
37
|
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
36
38
|
Requires-Dist: requests-mock>=1.11.0; extra == 'dev'
|
|
37
39
|
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
@@ -2,6 +2,8 @@ import contextlib
|
|
|
2
2
|
import json
|
|
3
3
|
import math
|
|
4
4
|
import os
|
|
5
|
+
import platform
|
|
6
|
+
import select
|
|
5
7
|
import signal
|
|
6
8
|
import sys
|
|
7
9
|
|
|
@@ -419,6 +421,35 @@ def _trigger_cloud_upload(
|
|
|
419
421
|
)
|
|
420
422
|
|
|
421
423
|
|
|
424
|
+
def _prompt_with_timeout(
|
|
425
|
+
choices: list[str],
|
|
426
|
+
default: str,
|
|
427
|
+
timeout: int = 20,
|
|
428
|
+
) -> str:
|
|
429
|
+
"""Prompt for a choice with a visible countdown, auto-selecting default on timeout."""
|
|
430
|
+
if platform.system() == "Windows":
|
|
431
|
+
return click.prompt(
|
|
432
|
+
f" Choose [{'/'.join(choices)}]",
|
|
433
|
+
type=click.Choice(choices),
|
|
434
|
+
default=default,
|
|
435
|
+
)
|
|
436
|
+
valid = set(choices)
|
|
437
|
+
for remaining in range(timeout, 0, -1):
|
|
438
|
+
sys.stdout.write(f"\r Choose [{'/'.join(choices)}] (auto-{default} in {remaining:2d}s): ")
|
|
439
|
+
sys.stdout.flush()
|
|
440
|
+
ready, _, _ = select.select([sys.stdin], [], [], 1.0)
|
|
441
|
+
if ready:
|
|
442
|
+
line = sys.stdin.readline().strip()
|
|
443
|
+
sys.stdout.write("\n")
|
|
444
|
+
sys.stdout.flush()
|
|
445
|
+
if line in valid:
|
|
446
|
+
return line
|
|
447
|
+
return default
|
|
448
|
+
sys.stdout.write("\n")
|
|
449
|
+
sys.stdout.flush()
|
|
450
|
+
return default
|
|
451
|
+
|
|
452
|
+
|
|
422
453
|
def _run_generation(
|
|
423
454
|
*,
|
|
424
455
|
preparation: GenerationPreparation,
|
|
@@ -470,14 +501,10 @@ def _run_generation(
|
|
|
470
501
|
tui.console.print(" [cyan]3)[/cyan] Abort")
|
|
471
502
|
tui.console.print()
|
|
472
503
|
|
|
473
|
-
choice =
|
|
474
|
-
"Choose an option",
|
|
475
|
-
type=click.Choice(["1", "2", "3"]),
|
|
476
|
-
default="1",
|
|
477
|
-
)
|
|
504
|
+
choice = _prompt_with_timeout(["1", "2", "3"], default="1", timeout=20)
|
|
478
505
|
|
|
479
506
|
if choice == "1":
|
|
480
|
-
# User wants to resume
|
|
507
|
+
# User wants to resume (or auto-selected after timeout)
|
|
481
508
|
options.resume = True
|
|
482
509
|
elif choice == "2":
|
|
483
510
|
# Clear and start fresh
|
|
@@ -493,7 +520,7 @@ def _run_generation(
|
|
|
493
520
|
if engine.load_checkpoint(retry_failed=options.retry_failed):
|
|
494
521
|
samples_done = engine._flushed_samples_count
|
|
495
522
|
failures_done = engine._flushed_failures_count
|
|
496
|
-
ids_processed = len(engine.
|
|
523
|
+
ids_processed = len(engine._completed)
|
|
497
524
|
retry_msg = " (retrying failed samples)" if options.retry_failed else ""
|
|
498
525
|
|
|
499
526
|
# Update TUI status panel with checkpoint progress
|
|
@@ -503,17 +530,18 @@ def _run_generation(
|
|
|
503
530
|
if failures_done > 0:
|
|
504
531
|
tui.info(
|
|
505
532
|
f"Resuming from checkpoint: {samples_done} samples, "
|
|
506
|
-
f"{failures_done} failed, {ids_processed}
|
|
533
|
+
f"{failures_done} failed, {ids_processed} UUIDs processed{retry_msg}"
|
|
507
534
|
)
|
|
508
535
|
else:
|
|
509
536
|
tui.info(
|
|
510
537
|
f"Resuming from checkpoint: {samples_done} samples, "
|
|
511
|
-
f"{ids_processed}
|
|
538
|
+
f"{ids_processed} UUIDs processed{retry_msg}"
|
|
512
539
|
)
|
|
513
540
|
else:
|
|
514
541
|
tui.info("No checkpoint found, starting fresh generation")
|
|
515
542
|
|
|
516
|
-
# Set up graceful Ctrl+C handling
|
|
543
|
+
# Set up graceful Ctrl+C handling
|
|
544
|
+
has_checkpoint = generation_params.get("checkpoint_interval") is not None
|
|
517
545
|
interrupt_count = 0
|
|
518
546
|
|
|
519
547
|
def handle_sigint(_signum, _frame):
|
|
@@ -522,7 +550,12 @@ def _run_generation(
|
|
|
522
550
|
|
|
523
551
|
if interrupt_count == 1:
|
|
524
552
|
engine.stop_requested = True
|
|
525
|
-
|
|
553
|
+
if has_checkpoint:
|
|
554
|
+
tui.warning("Stopping after current checkpoint... (Ctrl+C again to force quit)")
|
|
555
|
+
else:
|
|
556
|
+
tui.warning(
|
|
557
|
+
"Stopping... partial results will be saved. (Ctrl+C again to force quit)"
|
|
558
|
+
)
|
|
526
559
|
dataset_tui = get_dataset_tui()
|
|
527
560
|
dataset_tui.log_event("⚠ Graceful stop requested")
|
|
528
561
|
dataset_tui.status_stop_requested()
|
|
@@ -547,12 +580,22 @@ def _run_generation(
|
|
|
547
580
|
finally:
|
|
548
581
|
signal.signal(signal.SIGINT, original_handler)
|
|
549
582
|
|
|
550
|
-
|
|
583
|
+
output_config = preparation.config.get_output_config()
|
|
584
|
+
output_save_path = options.output_save_as or output_config["save_as"]
|
|
585
|
+
|
|
586
|
+
# If gracefully stopped, handle based on checkpoint availability
|
|
551
587
|
if engine.stop_requested:
|
|
588
|
+
if has_checkpoint:
|
|
589
|
+
# Checkpoint on disk — user can resume later
|
|
590
|
+
return
|
|
591
|
+
# No checkpoint — save whatever was generated so far
|
|
592
|
+
if dataset and len(dataset) > 0:
|
|
593
|
+
tui.info(f"Saving {len(dataset)} samples generated before stop")
|
|
594
|
+
save_dataset(dataset, output_save_path, preparation.config, engine=engine)
|
|
595
|
+
else:
|
|
596
|
+
tui.warning("No samples were generated before stop")
|
|
552
597
|
return
|
|
553
598
|
|
|
554
|
-
output_config = preparation.config.get_output_config()
|
|
555
|
-
output_save_path = options.output_save_as or output_config["save_as"]
|
|
556
599
|
save_dataset(dataset, output_save_path, preparation.config, engine=engine)
|
|
557
600
|
|
|
558
601
|
# Clean up checkpoint files after successful completion
|
|
@@ -651,8 +694,7 @@ def _run_generation(
|
|
|
651
694
|
"--cloud-upload",
|
|
652
695
|
type=click.Choice(["all", "dataset", "graph", "none"], case_sensitive=False),
|
|
653
696
|
default=None,
|
|
654
|
-
help="Upload to DeepFabric Cloud (experimental): all, dataset, graph, or none. "
|
|
655
|
-
"Enables headless mode for CI. Requires DEEPFABRIC_API_KEY or prior auth.",
|
|
697
|
+
help="Upload to DeepFabric Cloud (experimental): all, dataset, graph, or none. ",
|
|
656
698
|
)
|
|
657
699
|
@click.option(
|
|
658
700
|
"--checkpoint-interval",
|
|
@@ -783,7 +825,9 @@ def generate( # noqa: PLR0913
|
|
|
783
825
|
|
|
784
826
|
# Compute checkpoint directory once for consistent use throughout generation
|
|
785
827
|
# Use config file for hash, fallback to output path for config-less runs
|
|
786
|
-
path_source =
|
|
828
|
+
path_source = (
|
|
829
|
+
options.config_file or options.output_save_as or preparation.config.output.save_as
|
|
830
|
+
)
|
|
787
831
|
checkpoint_dir = options.checkpoint_path or get_checkpoint_dir(path_source)
|
|
788
832
|
|
|
789
833
|
# Auto-infer topics-load when resuming from checkpoint
|
|
@@ -1295,23 +1339,34 @@ def validate(config_file: str, check_api: bool) -> None: # noqa: PLR0912
|
|
|
1295
1339
|
f"estimated_paths={estimated_paths} ({degree}^{depth})"
|
|
1296
1340
|
)
|
|
1297
1341
|
|
|
1298
|
-
# Output summary with
|
|
1342
|
+
# Output summary with cycle-based generation info
|
|
1299
1343
|
num_samples = config.output.num_samples
|
|
1300
1344
|
batch_size = config.output.batch_size
|
|
1301
|
-
# Calculate num_steps - handle 'auto' and percentage strings
|
|
1302
|
-
if isinstance(num_samples, int):
|
|
1303
|
-
num_steps = math.ceil(num_samples / batch_size)
|
|
1304
|
-
output_info = f"Output: num_samples={num_samples}, batch_size={batch_size}, num_steps={num_steps}"
|
|
1305
|
-
else:
|
|
1306
|
-
# For 'auto' or percentage, we can't compute steps without topic count
|
|
1307
|
-
output_info = f"Output: num_samples={num_samples}, batch_size={batch_size}"
|
|
1308
1345
|
|
|
1309
|
-
#
|
|
1346
|
+
# Show output configuration
|
|
1347
|
+
output_info = f"Output: num_samples={num_samples}, concurrency={batch_size}"
|
|
1310
1348
|
if config.output.checkpoint:
|
|
1311
1349
|
checkpoint = config.output.checkpoint
|
|
1312
1350
|
output_info += f", checkpoint_interval={checkpoint.interval}"
|
|
1313
1351
|
tui.info(output_info)
|
|
1314
1352
|
|
|
1353
|
+
# Calculate and display cycle-based generation info
|
|
1354
|
+
if isinstance(num_samples, int):
|
|
1355
|
+
cycles_needed = math.ceil(num_samples / estimated_paths)
|
|
1356
|
+
final_cycle_size = num_samples - (cycles_needed - 1) * estimated_paths
|
|
1357
|
+
is_partial = final_cycle_size < estimated_paths
|
|
1358
|
+
|
|
1359
|
+
tui.info(
|
|
1360
|
+
f" → Cycles needed: {cycles_needed} "
|
|
1361
|
+
f"({num_samples} samples ÷ {estimated_paths} unique topics)"
|
|
1362
|
+
)
|
|
1363
|
+
if is_partial:
|
|
1364
|
+
tui.info(f" → Final cycle: {final_cycle_size} topics (partial)")
|
|
1365
|
+
elif num_samples == "auto":
|
|
1366
|
+
tui.info(f" → Will generate 1 sample per unique topic ({estimated_paths} samples)")
|
|
1367
|
+
else:
|
|
1368
|
+
tui.info(" → Samples calculated at runtime based on topic count")
|
|
1369
|
+
|
|
1315
1370
|
if config.huggingface:
|
|
1316
1371
|
hf_config = config.get_huggingface_config()
|
|
1317
1372
|
tui.info(f"Hugging Face: repo={hf_config.get('repository', 'not set')}")
|
|
@@ -1893,7 +1948,8 @@ def checkpoint_status(config_file: str) -> None:
|
|
|
1893
1948
|
# Check if checkpoint exists
|
|
1894
1949
|
if not metadata_path.exists():
|
|
1895
1950
|
tui.info(f"No checkpoint found at: {metadata_path}")
|
|
1896
|
-
tui.
|
|
1951
|
+
tui.console.print()
|
|
1952
|
+
tui.info("To enable checkpointing, run:")
|
|
1897
1953
|
tui.info(f" deepfabric generate {config_file} --checkpoint-interval 10")
|
|
1898
1954
|
return
|
|
1899
1955
|
|
|
@@ -778,7 +778,7 @@ def handle_cloud_upload( # noqa: PLR0911
|
|
|
778
778
|
|
|
779
779
|
# Build prompt based on what's available
|
|
780
780
|
if has_dataset and has_graph:
|
|
781
|
-
prompt_text = " Upload to DeepFabric Cloud?"
|
|
781
|
+
prompt_text = " Upload graph and dataset to DeepFabric Cloud?"
|
|
782
782
|
hint = "[dim](Y=both, n=skip, c=choose)[/dim]"
|
|
783
783
|
elif has_dataset:
|
|
784
784
|
prompt_text = " Upload dataset to DeepFabric Cloud?"
|
|
@@ -628,11 +628,13 @@ See documentation for full examples.
|
|
|
628
628
|
"output_save_as": self.output.save_as,
|
|
629
629
|
# Checkpoint config (nested inside output)
|
|
630
630
|
# Note: checkpoint_path can be None, meaning "auto-resolve" at runtime
|
|
631
|
-
"checkpoint_interval": self.output.checkpoint.interval
|
|
631
|
+
"checkpoint_interval": self.output.checkpoint.interval
|
|
632
|
+
if self.output.checkpoint
|
|
633
|
+
else None,
|
|
632
634
|
"checkpoint_path": self.output.checkpoint.path if self.output.checkpoint else None,
|
|
633
|
-
"checkpoint_retry_failed":
|
|
634
|
-
|
|
635
|
-
|
|
635
|
+
"checkpoint_retry_failed": self.output.checkpoint.retry_failed
|
|
636
|
+
if self.output.checkpoint
|
|
637
|
+
else False,
|
|
636
638
|
}
|
|
637
639
|
|
|
638
640
|
# Tool config
|
|
@@ -93,7 +93,7 @@ FAILED_TREE_SUFFIX = "_failed.jsonl"
|
|
|
93
93
|
CHECKPOINT_METADATA_SUFFIX = ".checkpoint.json"
|
|
94
94
|
CHECKPOINT_SAMPLES_SUFFIX = ".checkpoint.jsonl"
|
|
95
95
|
CHECKPOINT_FAILURES_SUFFIX = ".checkpoint.failures.jsonl"
|
|
96
|
-
CHECKPOINT_VERSION =
|
|
96
|
+
CHECKPOINT_VERSION = 4 # v4: (uuid, cycle) tuple tracking for cycle-based generation
|
|
97
97
|
|
|
98
98
|
# Stream simulation defaults
|
|
99
99
|
STREAM_SIM_CHUNK_SIZE = 8 # characters per chunk
|