From 3f6d20fd30de02e9608f0f852d80ab65c2a72bee Mon Sep 17 00:00:00 2001 From: tafreeman Date: Mon, 11 May 2026 15:36:04 -0500 Subject: [PATCH 1/2] =?UTF-8?q?chore:=20portfolio=20sprint=201=20=E2=80=94?= =?UTF-8?q?=20remove=20anti-signals,=20add=20orientation=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Delete raw AI session transcripts and binary planning files (convo.txt, chatgpt covo.txt, Repo Name Suggestions.docx/.pdf) from dev/planning/ - Archive dev/planning/ → docs/planning/ with historical-context README - Relocate .full-review/ → docs/review-process/; gitignore state.json - Add PORTFOLIO.md: stack context, where to start, design decisions, CI facts - Add README "For Reviewers" section linking arch.md, anti-scope, examples - Add docs/adr/README.md stub (Sprint 2 will populate with 3 ADRs) - Add dev/PORTFOLIO_BACKLOG.md: 16-item sprint-planned portfolio backlog - Strip 57 redundant @pytest.mark.asyncio decorators (asyncio_mode=auto) 387 tests pass, 85% coverage. Co-Authored-By: Claude Sonnet 4.6 --- .full-review/state.json | 16 - .gitignore | 1 + PORTFOLIO.md | 69 ++ dev/PORTFOLIO_BACKLOG.md | 211 ++++ dev/planning/Repo Name Suggestions.docx | Bin 13843 -> 0 bytes dev/planning/Repo Name Suggestions.pdf | Bin 34579 -> 0 bytes dev/planning/chatgpt covo.txt | 1012 ---------------- dev/planning/convo.txt | 1038 ----------------- docs/adr/README.md | 20 + {dev => docs}/planning/FINAL_VERDICT.md | 0 {dev => docs}/planning/MVP_SUMMARY.md | 0 {dev => docs}/planning/MVP_TIERS.md | 0 {dev => docs}/planning/PLAN.md | 0 {dev => docs}/planning/PLAN_SIMPLE.md | 0 {dev => docs}/planning/QUICK_REFERENCE.md | 0 docs/planning/README.md | 29 + {dev => docs}/planning/README_MVP.md | 0 {dev => docs}/planning/REVIEW_AUDIT.md | 0 {dev => docs}/planning/REVIEW_ITERATION_1.md | 0 {dev => docs}/planning/REVIEW_ITERATION_2.md | 0 {dev => docs}/planning/REVIEW_ITERATION_3.md | 0 {dev => docs}/planning/SHIP_DECISION.md | 0 {dev => docs}/planning/TIER1_SCAFFOLD.md | 0 .../review-process}/00-scope.md | 0 .../01-quality-architecture.md | 0 .../02-security-performance.md | 0 .../03-testing-documentation.md | 0 .../review-process}/04-best-practices.md | 0 .../review-process}/05-final-report.md | 0 .../review-process}/1a-code-quality.md | 0 .../review-process}/1b-architecture.md | 0 .../review-process}/2a-security.md | 0 .../review-process}/2b-performance.md | 0 .../review-process}/3a-testing.md | 0 .../review-process}/3b-documentation.md | 0 .../review-process}/4a-best-practices.md | 0 .../review-process}/4b-cicd.md | 0 .../review-process}/README.md | 0 .../review-process}/SECURITY_AUDIT.md | 0 .../review-process}/code-quality-review.md | 0 40 files changed, 330 insertions(+), 2066 deletions(-) delete mode 100644 .full-review/state.json create mode 100644 PORTFOLIO.md create mode 100644 dev/PORTFOLIO_BACKLOG.md delete mode 100644 dev/planning/Repo Name Suggestions.docx delete mode 100644 dev/planning/Repo Name Suggestions.pdf delete mode 100644 dev/planning/chatgpt covo.txt delete mode 100644 dev/planning/convo.txt create mode 100644 docs/adr/README.md rename {dev => docs}/planning/FINAL_VERDICT.md (100%) rename {dev => docs}/planning/MVP_SUMMARY.md (100%) rename {dev => docs}/planning/MVP_TIERS.md (100%) rename {dev => docs}/planning/PLAN.md (100%) rename {dev => docs}/planning/PLAN_SIMPLE.md (100%) rename {dev => docs}/planning/QUICK_REFERENCE.md (100%) create mode 100644 docs/planning/README.md rename {dev => docs}/planning/README_MVP.md (100%) rename {dev => docs}/planning/REVIEW_AUDIT.md (100%) rename {dev => docs}/planning/REVIEW_ITERATION_1.md (100%) rename {dev => docs}/planning/REVIEW_ITERATION_2.md (100%) rename {dev => docs}/planning/REVIEW_ITERATION_3.md (100%) rename {dev => docs}/planning/SHIP_DECISION.md (100%) rename {dev => docs}/planning/TIER1_SCAFFOLD.md (100%) rename {.full-review => docs/review-process}/00-scope.md (100%) rename {.full-review => docs/review-process}/01-quality-architecture.md (100%) rename {.full-review => docs/review-process}/02-security-performance.md (100%) rename {.full-review => docs/review-process}/03-testing-documentation.md (100%) rename {.full-review => docs/review-process}/04-best-practices.md (100%) rename {.full-review => docs/review-process}/05-final-report.md (100%) rename {.full-review => docs/review-process}/1a-code-quality.md (100%) rename {.full-review => docs/review-process}/1b-architecture.md (100%) rename {.full-review => docs/review-process}/2a-security.md (100%) rename {.full-review => docs/review-process}/2b-performance.md (100%) rename {.full-review => docs/review-process}/3a-testing.md (100%) rename {.full-review => docs/review-process}/3b-documentation.md (100%) rename {.full-review => docs/review-process}/4a-best-practices.md (100%) rename {.full-review => docs/review-process}/4b-cicd.md (100%) rename {.full-review => docs/review-process}/README.md (100%) rename {.full-review => docs/review-process}/SECURITY_AUDIT.md (100%) rename {.full-review => docs/review-process}/code-quality-review.md (100%) diff --git a/.full-review/state.json b/.full-review/state.json deleted file mode 100644 index 64b338c..0000000 --- a/.full-review/state.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "target": "executionkit Python library (8 commits, 324 tests, 83% coverage)", - "status": "in_progress", - "flags": { - "security_focus": false, - "performance_critical": false, - "strict_mode": false, - "framework": "Python 3.11+ / asyncio / httpx" - }, - "current_step": "1AB", - "current_phase": 1, - "completed_steps": ["0-scope"], - "files_created": ["00-scope.md"], - "started_at": "2026-04-06T23:45:00Z", - "last_updated": "2026-04-06T23:45:00Z" -} diff --git a/.gitignore b/.gitignore index 53d0a57..3fc4e8e 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,4 @@ site/ # Local review artifacts .full-review/ +.full-review/state.json diff --git a/PORTFOLIO.md b/PORTFOLIO.md new file mode 100644 index 0000000..5958676 --- /dev/null +++ b/PORTFOLIO.md @@ -0,0 +1,69 @@ +# PORTFOLIO.md + +## What This Repo Is + +ExecutionKit is a Python library of composable LLM reasoning patterns. It sits between +raw chat calls and full orchestration stacks — no SDK dependencies, no framework overhead. + +It does not include dashboards, multi-agent routing, stateful graphs, or native provider +adapters. See [CONTRIBUTING.md — Anti-Scope](CONTRIBUTING.md#anti-scope) for the reasoning +behind those boundaries. + +Three patterns ship: `consensus` (parallel voting), `refine_loop` (iterative improvement), +`react_loop` (tool calling). They compose via `pipe()`, accept any `LLMProvider`-conforming +object without inheritance, and enforce token/call budgets across parallel calls. + +## Where This Sits in the Stack + +``` +agentic-runtimes ← multi-agent DAG orchestration, YAML workflows, FastAPI runtime + └── ExecutionKit (this) + └── LLM provider ← any OpenAI-compatible endpoint +``` + +[agentic-runtimes](https://github.com/tafreeman/agentic-runtimes) uses ExecutionKit +patterns as the execution primitive for each agent step. ExecutionKit has zero runtime +dependencies; agentic-runtimes depends on FastAPI, LangGraph, and provider SDKs. + +## Where to Start + +| File | Contents | +|------|----------| +| [`docs/architecture.md`](docs/architecture.md) | Module map, dependency graph, data flow, error hierarchy, security notes, extension points | +| [`CONTRIBUTING.md`](CONTRIBUTING.md) | Dev setup, coding rules, commit convention, PR process, anti-scope list | +| [`executionkit/provider.py`](executionkit/provider.py) | `LLMProvider` protocol, `Provider` class, HTTP error classification | +| [`executionkit/cost.py`](executionkit/cost.py) | `CostTracker` — two-phase call accounting | +| [`examples/`](examples/) | Runnable scripts; set `OPENAI_API_KEY` or point at a local Ollama instance | + +## Design Decisions + +ADRs are in [`docs/adr/`](docs/adr/) (being written — Sprint 2). Short version: + +**Structural protocols over abstract base classes.** Any object with a matching `complete` +signature satisfies `LLMProvider` (PEP 544) without inheritance. Background: +[`docs/planning/FINAL_VERDICT.md`](docs/planning/FINAL_VERDICT.md). + +**Single `Provider` class over a native adapter matrix.** Most providers support the +OpenAI-compatible wire format. A native adapter per provider adds maintenance surface and +forces SDK dependencies. [`dev/BUILD_SPEC.md`](dev/BUILD_SPEC.md) has the full reasoning. + +**Flat package layout over `src/`.** For a library this size, `src/` adds no benefit and +breaks `python -c "import executionkit"` without an install step. Documented in +[`docs/architecture.md`](docs/architecture.md). + +## CI and Tooling + +- `mypy --strict` on all 20 source modules; `py.typed` (PEP 561) +- ruff rules: E/F/W/I/N/UP/S/B/A/C4/SIM/TCH/RUF +- Bandit SAST in CI; `detect-private-key` pre-commit hook +- 387 tests; 85% coverage; `MockProvider` in all unit tests (no live API calls) +- Matrix CI: Python 3.11 / 3.12 / 3.13, Ubuntu + Windows +- Dependabot weekly on pip and GitHub Actions + +## What Is Not Here + +- **LLM eval harness** — planned Sprint 3; see [`dev/PORTFOLIO_BACKLOG.md`](dev/PORTFOLIO_BACKLOG.md) +- **OpenTelemetry tracing** — planned Sprint 3 as an optional hook +- **TypeScript / HTML** — planned Sprint 4 +- **Federal deployment notes** — planned Sprint 3; the Ollama path supports air-gapped use + but the deployment guidance isn't written yet diff --git a/dev/PORTFOLIO_BACKLOG.md b/dev/PORTFOLIO_BACKLOG.md new file mode 100644 index 0000000..bf6d5a7 --- /dev/null +++ b/dev/PORTFOLIO_BACKLOG.md @@ -0,0 +1,211 @@ +# ExecutionKit — Portfolio Signal Backlog + +> **Purpose:** This backlog targets *hiring-panel perception* of the repo, not library +> functionality. Items come directly from the 2026-05-11 four-lens portfolio review. +> Do not conflate with `dev/BACKLOG.md` (library feature work). +> +> **Audience:** Solo candidate; estimated velocity 10–12 story points per sprint +> (part-time, ~3–5 focused hours/week on portfolio work). +> +> **Ratings:** +> - **Impact** (1–5): Portfolio signal value to a director-level reviewer in a 15-minute scan. +> 5 = eliminates a Critical/High risk or adds a principal-grade artifact. +> - **Complexity** (1–5): Effort and judgment required. +> 1 = under 30 min, 2 = 1–2 hr, 3 = half day, 5 = full day, 8 = 2–3 days. +> - **Story Points (SP):** Fibonacci sizing for sprint planning. +> - **Priority Score:** Impact ÷ Complexity (higher = do sooner). + +--- + +## Rating Legend + +| Impact | Meaning | +|--------|---------| +| 5 | Eliminates a Critical anti-signal OR adds a principal-level artifact | +| 4 | Directly improves a High-risk item or adds clear differentiation | +| 3 | Medium portfolio improvement; expected baseline for a library | +| 2 | Minor polish; most reviewers won't notice either way | +| 1 | Cosmetic only | + +| Complexity | Meaning | +|------------|---------| +| 1 | Under 30 min — mechanical, no judgment required | +| 2 | 1–2 hours — some decisions but well-defined | +| 3 | Half day — requires research or careful writing | +| 5 | Full day — architecture, new systems | +| 8 | 2–3 days — meaningful build work | + +--- + +## Full Backlog + +| ID | Item | Source | Impact | Complexity | SP | Priority Score | Sprint | +|----|------|--------|--------|------------|----|----------------|--------| +| PB-01 | Delete raw AI session transcripts from repo | Risk 1 / Quick Win 1 | 5 | 1 | 1 | 5.0 | S1 | +| PB-02 | Write 3 ADRs (structural protocols, flat layout, single provider) | Risk 3 / Quick Win 2 | 5 | 2 | 3 | 2.5 | S2 | +| PB-03 | Add `PORTFOLIO.md` root-level orientation guide | Quick Win 4 | 4 | 1 | 1 | 4.0 | S1 | +| PB-04 | Strip 57 redundant `@pytest.mark.asyncio` decorators | Risk 4 / Quick Win 3 | 2 | 1 | 1 | 2.0 | S1 | +| PB-05 | README: add "For Reviewers" nav section surfacing arch.md + ADRs | Lens 3 / Landing Page | 3 | 1 | 1 | 3.0 | S1 | +| PB-06 | Restructure `dev/planning/` — archive historical AI artifacts, move to `docs/` | Risk 1 / Anti-Signal | 4 | 2 | 2 | 2.0 | S1 | +| PB-07 | Relocate or gitignore `.full-review/` machine-generated state files | Anti-Signal | 3 | 1 | 1 | 3.0 | S1 | +| PB-08 | Add `uv.lock` (or `requirements.lock`) + `pip-audit` step to CI | Risk 5 / Gap 4 | 3 | 1 | 1 | 3.0 | S2 | +| PB-09 | Add CodeQL (or Semgrep) SAST job to CI alongside Bandit | Gap 4 / Supply chain | 3 | 2 | 2 | 1.5 | S2 | +| PB-10 | Generate and commit SBOM (`cyclonedx-bom` or `pip-sbom`) | Gap 4 / OWASP SCVS C-9.1 | 3 | 2 | 2 | 1.5 | S2 | +| PB-11 | Add OIDC Trusted Publishing to `publish.yml` (replace classic token) | Gap 4 / SLSA L1 | 3 | 2 | 2 | 1.5 | S2 | +| PB-12 | Minimal LLM eval harness: Promptfoo or custom deterministic eval in CI | Risk 2 / Gap 1 / MLOps L2 | 5 | 5 | 8 | 1.0 | S3 | +| PB-13 | OTel pluggable tracing hook on `PatternResult` + example Langfuse export | Gap 2 / Google SRE | 4 | 5 | 8 | 0.8 | S3 | +| PB-14 | Federal/regulated readiness: ADR + notes on CUI handling, air-gap path, audit trail | Gap 3 / NIST RMF | 4 | 3 | 5 | 1.3 | S3 | +| PB-15 | Fix `examples/` excluded from `mypy --strict` (implicit type gap) | Lens 1 / Tooling | 2 | 2 | 2 | 1.0 | S2 | +| PB-16 | Cross-stack work: TypeScript usage example or simple HTML demo tool interface | Gap 5 / Breadth | 3 | 8 | 13 | 0.4 | S4 | + +--- + +## Sprint Plans + +> Capacity: ~10–12 SP per sprint (3–5 focused hours/week on portfolio work). +> Sprints are thematic — each has a reviewable state by end. + +--- + +### Sprint 1 — "Stop the Bleeding" +**Goal:** A director landing on this repo today sees no anti-signals in the first 15 minutes. +**Capacity:** 7 SP | **Load:** 7 SP (100%) + +| ID | Item | SP | Notes | +|----|------|----|-------| +| PB-01 | Delete raw AI transcripts (`convo.txt`, `chatgpt covo.txt`, `.docx`, `.pdf`) | 1 | `git rm` + update `.gitignore`. Check no other files in dev/planning/ are still raw logs. | +| PB-03 | Add `PORTFOLIO.md` at repo root | 1 | 3 paragraphs: what this repo is, what to read first (arch.md, CONTRIBUTING.md Anti-Scope, examples/), relationship to agentic-runtimes. | +| PB-04 | Strip 57 redundant `@pytest.mark.asyncio` decorators | 1 | `asyncio_mode = "auto"` makes them no-ops. `grep -rn "@pytest.mark.asyncio" tests/` then surgical delete. CI must still pass. | +| PB-05 | README "For Reviewers" section | 1 | Below badges, before Quick Start. Two links: `docs/architecture.md`, `CONTRIBUTING.md#anti-scope`. One sentence framing the 2-tier stack. | +| PB-06 | Archive `dev/planning/` AI planning artifacts | 2 | Move to `docs/planning/` with a header marking them historical. Delete raw logs (PB-01 covers the worst offenders). Keep FINAL_VERDICT.md, SHIP_DECISION.md as decision context — they'll become source material for PB-02 ADRs. | +| PB-07 | Relocate `.full-review/` state files | 1 | Move to `docs/review-process/` or add `state.json` to `.gitignore`. The playbooks (`01-quality-architecture.md` etc.) can stay in `docs/review-process/` as methodology documentation. | + +**Definition of Done:** +- [ ] No raw AI conversation transcripts on `main` +- [ ] `PORTFOLIO.md` exists at root and links to 3 key artifacts +- [ ] `pytest` green with redundant marks stripped +- [ ] README "For Reviewers" section visible above the fold on GitHub + +--- + +### Sprint 2 — "Build the Signal" +**Goal:** Principal-grade artifacts are now discoverable and supply-chain posture is documented. +**Capacity:** 12 SP | **Load:** 12 SP (100%) + +| ID | Item | SP | Notes | +|----|------|----|-------| +| PB-02 | Write 3 ADRs | 3 | Use [MADR template](https://adr.github.io/madr/). Create `docs/adr/README.md` index. **ADR-001:** Structural protocols over ABC (pull rationale from `dev/planning/FINAL_VERDICT.md`). **ADR-002:** Flat layout over src/ (documented in `docs/architecture.md:11-12`). **ADR-003:** Single OpenAI-compatible provider vs. native adapter matrix (pull from `dev/BUILD_SPEC.md` Anti-Scope section). | +| PB-08 | Add lockfile + pip-audit to CI | 1 | `pip install uv && uv pip compile pyproject.toml --extra dev -o requirements.lock`. Add `pip-audit` step after Bandit job in `ci.yml`. Commit `requirements.lock`. | +| PB-09 | Add CodeQL SAST job to CI | 2 | GitHub provides CodeQL Actions for free on public repos. Add `.github/workflows/codeql.yml` with Python language config. Alternatively add a `semgrep --config=auto` step to existing `ci.yml`. | +| PB-10 | Generate and commit SBOM | 2 | `pip install cyclonedx-bom && cyclonedx-py -p -o sbom.json`. Add `sbom.json` to repo root. Add generation step to `publish.yml` so it regenerates on each release. | +| PB-11 | OIDC Trusted Publishing in `publish.yml` | 2 | Replace `PYPI_API_TOKEN` secret with PyPA OIDC trusted publisher. Update workflow to use `pypa/gh-action-pypi-publish@release/v1` with `id-token: write` permission. Register the trusted publisher on PyPI. | +| PB-15 | Fix `examples/` mypy exclusion | 2 | Remove `examples/` from `[tool.mypy] exclude` in `pyproject.toml`. Fix any type errors in `examples/*.py`. Users copy-paste examples — they should be typed. | + +**Definition of Done:** +- [ ] 3 ADRs committed under `docs/adr/` with `docs/adr/README.md` index +- [ ] `requirements.lock` present and CI installs from it +- [ ] CodeQL or Semgrep running in CI with no critical findings +- [ ] `sbom.json` present at root, regenerated by `publish.yml` +- [ ] `examples/*.py` passes `mypy --strict` + +--- + +### Sprint 3 — "Demonstrate Depth" +**Goal:** The repo shows production-readiness thinking a GenAI delivery lead is expected to have: eval gates and observability hooks. +**Capacity:** 13 SP | **Load:** 13 SP (100%) + +| ID | Item | SP | Notes | +|----|------|----|-------| +| PB-12 | Minimal LLM eval harness in CI | 8 | **Option A (Promptfoo):** Add `evals/promptfoo.yaml` with 3–5 deterministic test cases against `MockProvider`. Add `promptfoo eval` step to CI that fails on regression. **Option B (custom):** Add `evals/eval_consensus.py` that runs consensus against a fixed `MockProvider` fixture, asserts `agreement_ratio >= 0.6`, and returns non-zero exit on failure. Add as a CI step. Either approach produces the artifact; Option B requires no new tooling dep. Document in `docs/evals/README.md` why this exists and what it gates. | +| PB-13 | OTel pluggable tracing hook | 8 | Add an optional `tracer: opentelemetry.trace.Tracer | None = None` parameter to `consensus`, `refine_loop`, `react_loop`. When non-None, wrap each `checked_complete` call in a span with attributes: `pattern.name`, `pattern.iteration`, `llm.model`, `llm.input_tokens`, `llm.output_tokens`. Gate behind `TYPE_CHECKING` import so OTel is not a hard dep. Add `executionkit[otel]` optional extra. Add an example `examples/otel_tracing.py` exporting to stdout. This directly answers "how do you monitor this in production?" | +| PB-14 | Federal/regulated readiness documentation | 5 | **ADR-004:** Data residency and air-gap deployment (Ollama path enables air-gapped use; document CUI-scope guidance for self-hosted models). Add `docs/federal-deployment.md`: covers local-only model path, no-phone-home guarantee (stdlib urllib, no telemetry), audit trail pattern using `PatternResult.cost` as an immutable call record, credential isolation (env vars, no logging). Not a security claim — a deployment guide for regulated environments. Cross-link from `SECURITY.md`. | + +**Definition of Done:** +- [ ] `evals/` directory exists with at least 3 deterministic test cases +- [ ] Eval step runs in CI and blocks merge on regression +- [ ] OTel hook implemented with `examples/otel_tracing.py` +- [ ] `docs/federal-deployment.md` committed and cross-linked from `SECURITY.md` and `README.md` +- [ ] ADR-004 committed + +--- + +### Sprint 4 — "Strategic Differentiation" +**Goal:** Breadth signal for a delivery lead role: the portfolio shows more than one language/stack. +**Capacity:** 13 SP | **Load:** 13 SP (100%) + +| ID | Item | SP | Notes | +|----|------|----|-------| +| PB-16 | Cross-stack work: TypeScript or HTML | 13 | **Recommended path:** Add `examples/browser-demo/` — a single-file HTML + vanilla JS interface that calls a local Ollama instance via the same OpenAI-compatible endpoint ExecutionKit uses. No build step, no framework. Shows: (1) ability to work across the stack, (2) understanding that the library's provider protocol maps directly to a browser fetch, (3) practical zero-dependency design thinking carried into a second language. Alternatively, add a TypeScript wrapper `examples/ts-client/index.ts` demonstrating how to call an OpenAI-compatible endpoint and consume a `PatternResult`-shaped response. Add a top-level note in `README.md` linking to it. | + +**Definition of Done:** +- [ ] `examples/browser-demo/` or `examples/ts-client/` committed and documented +- [ ] Referenced from `README.md` +- [ ] Works against local Ollama with no API key + +--- + +## Dependency Graph + +``` +PB-01 (delete transcripts) + └── PB-06 (archive planning/) — do PB-01 first, then restructure + +PB-02 (ADRs) + └── PB-06 (archive planning/) — ADRs pull content from planning docs; archive after extraction + +PB-08 (lockfile) + └── PB-09 (CodeQL) — independent, but batch into same CI PR + └── PB-10 (SBOM) + └── PB-11 (OIDC publish) + +PB-12 (eval harness) — independent; no blocking deps +PB-13 (OTel hooks) — independent; no blocking deps +PB-14 (federal docs) — independent; no blocking deps + +PB-15 (examples/ mypy) — must come before PB-16 (cross-stack work) + └── PB-16 (cross-stack work) +``` + +Items within each sprint are independent and can be batched into a single PR per sprint, +except where the dependency graph requires sequencing within a sprint. + +--- + +## Backlog Items Not Scheduled (Parking Lot) + +These have real value but are deferred past Sprint 4 due to complexity or diminishing return +at this portfolio stage. + +| ID | Item | Reason deferred | +|----|------|-----------------| +| PL-01 | Sigstore/cosign artifact signing on PyPI releases | SLSA L2+; low ROI for a v0.1 alpha with limited external consumers | +| PL-02 | Promptfoo full regression suite with golden outputs | Requires stable prompt templates; premature before v0.2 pattern set | +| PL-03 | Structured logging (`structlog`) replacing `logging` module | Architecture change; low reviewer impact relative to effort | +| PL-04 | GitHub issue templates and PR template | Good practice, not a 15-minute-scan signal | +| PL-05 | Streaming provider support | Scoped to v0.2 per `dev/BUILD_SPEC.md`; adding it here breaks scope discipline | + +--- + +## Metrics to Track Progress + +Run these at the start of each sprint to confirm direction: + +```bash +# Confirm no raw logs remain +find dev/ -name "*.txt" -o -name "convo*" | wc -l # target: 0 + +# Confirm ADRs exist +ls docs/adr/*.md | wc -l # target: >= 3 after Sprint 2 + +# Confirm asyncio marks stripped +grep -r "@pytest.mark.asyncio" tests/ | wc -l # target: 0 after Sprint 1 + +# Confirm lockfile present +ls requirements.lock # target: exists after Sprint 2 + +# Confirm eval harness runs +python evals/eval_consensus.py && echo "PASS" # target: exits 0 after Sprint 3 + +# Confirm SBOM present +ls sbom.json # target: exists after Sprint 2 +``` diff --git a/dev/planning/Repo Name Suggestions.docx b/dev/planning/Repo Name Suggestions.docx deleted file mode 100644 index 570295d3f98db0b1a17b4e22141c5035a6613a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13843 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 diff --git a/dev/planning/Repo Name Suggestions.pdf b/dev/planning/Repo Name Suggestions.pdf deleted file mode 100644 index a80949f5b46f490749e2dc2e0bd3752244eb5653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34579 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 evaluate -> prune -> recurse - 31 react_loop.py # think -> act -> observe -> loop - 32 consensus.py # call N times -> vote -> return best - 33 refine_loop.py # generate -> evaluate -> improve -> converge - 34 _engine/ - 35 __init__.py - 36 context.py # Simplified ExecutionContext (from engine/context.py) - 37 retry.py # RetryConfig + backoff (from engine/step.py:18-68) - 38 parallel.py # gather_bounded, race_first (from dag_executor.py) - 39 convergence.py # NEW: delta threshold + plateau detection - 40 tests/ - 41 conftest.py # MockProvider fixture, shared helpers - 42 test_tree_of_thought.py - 43 test_react_loop.py - 44 test_consensus.py - 45 test_refine_loop.py - 46 test_engine.py # context, retry, parallel, convergence - 47 examples/ - 48 basic_tot.py - 49 basic_react.py - 50 basic_consensus.py - 51 basic_refine.py - 52 ``` - 53 - 54 **Dependencies:** Only `pydantic>=2.0`. Users bring their own LLM client. - 55 - 56 --- - 57 - 58 ## Public API (4 Core Patterns) - 59 - 60 ### Provider Protocol — users implement this once - 61 - 62 ```python - 63 # provider.py - 64 @runtime_checkable - 65 class LLMProvider(Protocol): - 66 async def complete( - 67 self, - 68 messages: Sequence[dict[str, Any]], - 69 *, - 70 temperature: float = 0.7, - 71 max_tokens: int = 4096, - 72 tools: Sequence[dict[str, Any]] | None = None, - 73 response_format: type | None = None, - 74 **kwargs: Any, - 75 ) -> LLMResponse: ... - 76 ``` - 77 - 78 ### Pattern 1: `tree_of_thought()` - 79 - 80 ```python - 81 result = await tree_of_thought( - 82 provider, - 83 prompt="Solve: what's 24 using 1,3,4,6?", - 84 num_branches=3, # Generate 3 candidates per level - 85 beam_width=2, # Keep top 2 - 86 max_depth=3, # 3 levels of reasoning - 87 evaluator=my_scorer, # Custom scoring function - 88 ) - 89 # result.value = best answer, result.cost = token/cost metrics - 90 ``` - 91 - 92 ### Pattern 2: `react_loop()` - 93 - 94 ```python - 95 result = await react_loop( - 96 provider, - 97 prompt="Find the CEO of the company that acquired Twitter", - 98 tools=[web_search, wikipedia_lookup], - 99 max_rounds=8, - 100 ) - 101 ``` - 102 - 103 ### Pattern 3: `consensus()` - 104 - 105 ```python - 106 result = await consensus( - 107 provider, - 108 prompt="Classify this text: ...", - 109 response_schema=Classification, - 110 num_samples=5, - 111 strategy="majority", - 112 ) - 113 ``` - 114 - 115 ### Pattern 4: `refine_loop()` - 116 - 117 ```python - 118 result = await refine_loop( - 119 provider, - 120 prompt="Write a haiku about recursion", - 121 evaluator=quality_scorer, - 122 target_score=0.9, - 123 max_iterations=5, - 124 patience=2, - 125 ) - 126 ``` - 127 - 128 All return `PatternResult[T]` with `.value`, `.score`, `.cost`, `.iterations`, `.trace`. - 129 - 130 --- - 131 - 132 ## What to Extract vs Write New - 133 - 134 ### EXTRACT from `agentic-workflows-v2/agentic_v2/` - 135 - 136 | Target | Source File | Lines | What | Adaptation | - 137 |--------|------------|-------|------|------------| - 138 | `_engine/context.py` | `engine/context.py` | all | Variable store + child scoping + event hooks | Strip workflow_id, - 139 | `_engine/retry.py` | `engine/step.py` | 18-68 | RetryConfig + backoff strategies | Extract verbatim. Self-contained - 140 | `_engine/parallel.py` | `engine/dag_executor.py` | 194+ | FIRST_COMPLETED parallel scheduling | Generalize into - 141 | `patterns/react_loop.py` | `engine/tool_execution.py` | 220-440 | Tool normalization, serialization, execution loop - 142 | (fallback parser) | `agents/json_extraction.py` | all | Balanced-brace JSON extraction | Use as fallback when - 143 der lacks structured output. 156 lines as-is | - 144 ### WRITE NEW - 145 - 146 | File | Est. LOC | Complexity | Why New | - 147 |------|----------|------------|---------| - 148 | `provider.py` | 60 | Low | No equivalent — current code uses tied ABC | - 149 | `types.py` | 100 | Low | PatternResult, Branch, CostMetrics, Tool | - 150 | `cost.py` | 120 | Medium | Structured cost-per-pattern tracking | - 151 | `patterns/tree_of_thought.py` | 250 | **High** | Core new value — branch + evaluate + prune + recurse | - 152 | `patterns/consensus.py` | 150 | Medium | Parallel sampling + voting aggregation | - 153 | `patterns/refine_loop.py` | 180 | Medium | Loop + convergence detection | - 154 | `_engine/convergence.py` | 80 | Medium | Delta threshold + plateau detection | - 155 - 156 **Total new code: ~940 LOC. Total extracted+adapted: ~560 LOC. Grand total: ~1,500 LOC.** - 157 - 158 --- - 159 - 160 ## Phase Plan - 161 - 162 ### Phase 1: Foundation (Days 1-3) - 163 - Scaffold package + pyproject.toml - 164 - `provider.py` — LLMProvider Protocol + LLMResponse - 165 - `types.py` — PatternResult, Branch, CostMetrics, Tool - 166 - `cost.py` — CostTracker - 167 - `_engine/context.py` — simplified ExecutionContext (extract from `engine/context.py`) - 168 - `_engine/retry.py` — extract RetryConfig from `engine/step.py:18-68` - 169 - `_engine/parallel.py` — extract gather_bounded from `dag_executor.py` - 170 - `_engine/convergence.py` — write convergence detector - 171 - Tests: provider protocol, types, cost, convergence, parallel - 172 - 173 ### Phase 2: Core Patterns (Days 4-8) - 174 Build order by complexity (simpler first): - 175 1. **`consensus.py`** (Day 4) — simplest; tests provider + parallel infra - 176 2. **`refine_loop.py`** (Day 5) — sequential loop; tests cost + convergence - 177 3. **`react_loop.py`** (Days 6-7) — tool loop; extracts from `tool_execution.py` - 178 4. **`tree_of_thought.py`** (Days 7-8) — most complex; depends on parallel + convergence - 179 - Tests: 3 categories per pattern (unit with mocks, edge cases, integration markers) - 180 - 181 ### Phase 3: Polish + Release (Days 9-10) - 182 - `__init__.py` — public exports - 183 - Sync wrappers (`tree_of_thought_sync()`, etc.) - 184 - JSON extraction fallback for non-structured providers - 185 - Docstrings + README with 4 working examples - 186 - CI: ruff + mypy --strict + pytest --cov-fail-under=80 - 187 - 188 ### Phase 4: v0.2 Composition (Days 11-14, DEFER) - 189 - `compose()` — chain patterns together - 190 - OpenTelemetry integration (optional) - 191 - LangGraph node adapter (optional) - 192 - Streaming intermediate results - 193 - 194 --- - 195 - 196 ## Critical Source Files - 197 - 198 - `D:/source/prompts/agentic-workflows-v2/agentic_v2/engine/context.py` — hierarchical context to simplify - 199 - `D:/source/prompts/agentic-workflows-v2/agentic_v2/engine/dag_executor.py` — FIRST_COMPLETED parallel pattern - 200 - `D:/source/prompts/agentic-workflows-v2/agentic_v2/engine/step.py` — RetryConfig (lines 18-68), loop_until (lines - 201 - `D:/source/prompts/agentic-workflows-v2/agentic_v2/engine/tool_execution.py` — ReAct tool loop (lines 373-440) - 202 - `D:/source/prompts/agentic-workflows-v2/agentic_v2/agents/json_extraction.py` — balanced-brace extraction (fallback) - 203 - 204 --- - 205 - 206 ## Risk Mitigation - 207 - 208 | Risk | Mitigation | - 209 |------|-----------| - 210 | **Cost explosion** (ToT branches × depth = 100s of LLM calls) | `max_tokens` and `max_cost` params on every pattern. - 211 | **Paradigm lock-in** (models add native reasoning) | Patterns are stateless functions, not framework classes. If - 212 | **Model churn** (prompts break across models) | All prompts overridable via params. `response_schema` forces - 213 tured output. JSON extraction fallback for messy responses | - 214 --- - 215 - 216 ## Test Strategy - 217 - 218 Each pattern gets 3 test categories: - 219 1. **Unit tests** — MockProvider returns canned responses. Verify message formation, loop termination, cost tracking - 220 2. **Edge cases** — budget exhaustion, all branches pruned, max iterations, empty tool results, convergence on round 1 - 221 3. **Integration markers** — `@pytest.mark.integration` for real LLM calls (skipped in CI) - 222 - 223 Coverage target: 80% overall, 90% for pattern modules. - 224 - 225 --- - 226 - 227 ## Agent Team Build Assignments - 228 - 229 | Agent | Phase | Files | - 230 |-------|-------|-------| - 231 | **tdd-guide** | 1-3 | Write tests FIRST for each module | - 232 | **build-agent-1** | 1 | Package scaffold, provider.py, types.py, cost.py, _engine/* | - 233 | **build-agent-2** | 2 | consensus.py, refine_loop.py | - 234 | **build-agent-3** | 2 | react_loop.py (extract from tool_execution.py), tree_of_thought.py | - 235 | **code-reviewer** | 3 | Final review of all modules | - 236 | **security-reviewer** | 2 | Audit expression eval if included, JSON extraction DoS limits | - 237 - 238 --- - 239 - 240 ## Verification - 241 - 242 1. `ruff check src/executionkit` — lint passes - 243 2. `mypy --strict src/executionkit` — type check passes - 244 3. `pytest tests/ --cov=executionkit --cov-fail-under=80` — all tests pass, 80%+ coverage - 245 4. Run `examples/basic_tot.py` with a real provider — produces valid tree with scores - 246 5. Run `examples/basic_react.py` with mock tools — completes think/act/observe loop - 247 6. Run `examples/basic_consensus.py` — returns majority vote from 5 samples - 248 7. Run `examples/basic_refine.py` — converges within max_iterations - - - - - - - - - - - - - - - ⎿ Tool use rejected - -● Great question. Let me explain how ExecutionKit plugs into LLM calls. - - How the Provider Protocol Works - - ExecutionKit does NOT ship with any LLM provider. Instead, the user wraps their existing client in a 10-line adapter: - - Example: Wrapping OpenAI - - from openai import AsyncOpenAI - from executionkit import LLMProvider, LLMResponse - - class OpenAIProvider: - def __init__(self, model: str = "gpt-4o"): - self.client = AsyncOpenAI() - self.model = model - - async def complete(self, messages, *, temperature=0.7, max_tokens=4096, - tools=None, response_format=None, **kwargs) -> LLMResponse: - params = {"model": self.model, "messages": messages, - "temperature": temperature, "max_tokens": max_tokens} - if tools: - params["tools"] = tools - if response_format: - params["response_format"] = {"type": "json_schema", - "json_schema": response_format.model_json_schema()} - - resp = await self.client.chat.completions.create(**params) - choice = resp.choices[0] - return LLMResponse( - content=choice.message.content or "", - tool_calls=[tc.model_dump() for tc in (choice.message.tool_calls or [])], - input_tokens=resp.usage.prompt_tokens, - output_tokens=resp.usage.completion_tokens, - model=self.model, - ) - - Then use any pattern: - - provider = OpenAIProvider("gpt-4o-mini") - - # Tree of Thought - result = await tree_of_thought(provider, "Solve: make 24 from 1,3,4,6") - - # ReAct with tools - result = await react_loop(provider, "Research topic X", tools=[web_search]) - - # Consensus voting - result = await consensus(provider, "Classify: ...", num_samples=5) - - How it flows inside a pattern: - - tree_of_thought(provider, prompt) - │ - ├── Branch generation: - │ provider.complete([{"role": "user", "content": "Generate 3 approaches to: {prompt}"}]) - │ → LLMResponse(content="Approach 1: ...\nApproach 2: ...\nApproach 3: ...") - │ → Parse into 3 Branch objects - │ - ├── Branch evaluation (parallel via gather_bounded): - │ provider.complete([{"role": "user", "content": "Score this approach 0-1: {branch.content}"}]) - │ → LLMResponse(content="0.85") → branch.score = 0.85 - │ (repeated for each branch, concurrently) - │ - ├── Prune: keep top beam_width branches (e.g., 2 of 3) - │ - ├── Recurse: for each surviving branch, generate sub-branches at next depth - │ - └── Return: PatternResult(value=best_leaf.content, score=0.92, cost=CostMetrics(...)) - - Key design: Provider is a Protocol, not a base class - - @runtime_checkable - class LLMProvider(Protocol): - async def complete(self, messages, **kwargs) -> LLMResponse: ... - - This means any object with a complete() method works — no inheritance required. Users can wrap: - - openai.AsyncOpenAI - - anthropic.AsyncAnthropic - - litellm.acompletion - - ollama REST calls - - A mock for testing - - The pattern functions call provider.complete() with standard chat messages. They never touch HTTP, API keys, or provider-specific - logic. That's entirely the user's responsibility. - - What about structured output? - - When a pattern needs structured data (e.g., ToT branch scores, ReAct tool calls), it passes response_format=SomeModel to - provider.complete(). If the user's provider supports native structured output (OpenAI, Anthropic), their adapter uses it. If not, - ExecutionKit falls back to the existing extract_json() balanced-brace parser from the codebase. - - Want me to update the plan with more detail on the provider integration, or are you ready to approve? - -✻ Crunched for 1m 47s - -❯ i would like to have some minimal side module for the actal provider so could spin up with just an api enpoint and key sayd for -github copilot or ollama local models - -● That makes total sense — "bring your own provider" is the wrong v0.1 DX. Developers want pip install executionkit[github] and go. - Let me update the plan. - -● Reading Plan(C:\Users\tandf\.claude\plans\linked-twirling-crystal.md · lines 0-49) - ⎿ Read 50 lines - -● Reading Plan(C:\Users\tandf\.claude\plans\linked-twirling-crystal.md · lines 50-99) - ⎿ Read 50 lines - -● Now let me update the plan to add the built-in providers module. - -● Updated plan - ⎿ Added 10 lines, removed 1 line - 37 retry.py # RetryConfig + backoff (from engine/step.py:18-68) - 38 parallel.py # gather_bounded, race_first (from dag_executor.py) - 39 convergence.py # NEW: delta threshold + plateau detection - 40 + providers/ # Minimal built-in providers (optional extras) - 41 + __init__.py # convenience: from executionkit.providers import OpenAIProvider - 42 + _openai.py # OpenAI + Azure + GitHub Models (all use openai SDK) - 43 + _ollama.py # Local Ollama via stdlib urllib (zero deps) - 44 + _anthropic.py # Claude (optional) - 45 + _mock.py # MockProvider for testing (no deps) - 46 tests/ - 47 conftest.py # MockProvider fixture, shared helpers - 48 test_tree_of_thought.py - ... - 50 test_consensus.py - 51 test_refine_loop.py - 52 test_engine.py # context, retry, parallel, convergence - 53 + test_providers.py # Built-in provider tests - 54 examples/ - 55 basic_tot.py - 56 basic_react.py - 57 basic_consensus.py - 58 basic_refine.py - 59 + quickstart_github.py # 5-line example with GitHub Models - 60 + quickstart_ollama.py # 5-line example with local Ollama - 61 ``` - 62 - 54 -**Dependencies:** Only `pydantic>=2.0`. Users bring their own LLM client. - 63 +**Dependencies:** Core requires only `pydantic>=2.0`. Built-in providers are optional extras. - 64 - 65 --- - 66 - - - - - - - - -● Now add the providers section after the Provider Protocol section: - -● Updated plan - ⎿ Added 62 lines - 84 ) -> LLMResponse: ... - 85 ``` - 86 - 87 +### Built-in Providers (optional extras) - 88 + - 89 +3 minimal providers ship with ExecutionKit so devs can start with just an API key: - 90 + - 91 +**1. OpenAI-compatible** (`pip install executionkit[openai]`) — covers OpenAI, Azure, AND GitHub Models/Copilot sin - +ce they all use the OpenAI SDK with different `base_url`: - 92 + - 93 +```python - 94 +from executionkit.providers import OpenAIProvider - 95 + - 96 +# GitHub Models — just an endpoint + token - 97 +provider = OpenAIProvider( - 98 + model="gpt-4o-mini", - 99 + base_url="https://models.inference.ai.azure.com", - 100 + api_key=os.environ["GITHUB_TOKEN"], - 101 +) - 102 + - 103 +# OpenAI — just a key - 104 +provider = OpenAIProvider(model="gpt-4o-mini", api_key="sk-...") - 105 + - 106 +# Azure OpenAI — endpoint + key + deployment - 107 +provider = OpenAIProvider( - 108 + model="my-deployment", - 109 + base_url="https://myorg.openai.azure.com/", - 110 + api_key=os.environ["AZURE_OPENAI_API_KEY"], - 111 + api_version="2024-10-21", - 112 +) - 113 + - 114 +# Then use any pattern immediately - 115 +result = await tree_of_thought(provider, "Solve this problem...") - 116 +``` - 117 + - 118 +**2. Ollama** (`pip install executionkit` — zero extra deps, uses stdlib urllib): - 119 + - 120 +```python - 121 +from executionkit.providers import OllamaProvider - 122 + - 123 +# Local model — just a host (default localhost:11434) - 124 +provider = OllamaProvider(model="llama3.2") - 125 + - 126 +# Remote Ollama - 127 +provider = OllamaProvider(model="mistral", host="http://gpu-server:11434") - 128 + - 129 +result = await consensus(provider, "Classify this text...", num_samples=5) - 130 +``` - 131 + - 132 +**3. Anthropic** (`pip install executionkit[anthropic]`): - 133 + - 134 +```python - 135 +from executionkit.providers import AnthropicProvider - 136 + - 137 +provider = AnthropicProvider(model="claude-sonnet-4-20250514", api_key="sk-ant-...") - 138 +result = await react_loop(provider, "Research topic X", tools=[...]) - 139 +``` - 140 + - 141 +**Key design decisions:** - 142 +- Each provider is ~50-80 lines — thin wrapper, not a framework - 143 +- `OpenAIProvider` covers 3 services via `base_url` param (OpenAI, Azure, GitHub Models) - 144 +- `OllamaProvider` uses stdlib `urllib` — zero pip dependencies for local-only use - 145 +- `MockProvider` always ships (in `_mock.py`) for testing — no deps - 146 +- All implement the same `LLMProvider` Protocol - 147 +- Source: adapted from `tools/llm/provider_adapters.py` (existing call_openai, call_ollama, call_claude functions) - 148 + - 149 ### Pattern 1: `tree_of_thought()` - 150 - 151 ```python - -● Now update the dependencies section and the extraction table: - -● Updated plan - ⎿ Added 12 lines, removed 1 line - 60 quickstart_ollama.py # 5-line example with local Ollama - 61 ``` - 62 - 63 -**Dependencies:** Core requires only `pydantic>=2.0`. Built-in providers are optional extras. - 63 +**Dependencies:** - 64 +```toml - 65 +[project] - 66 +dependencies = ["pydantic>=2.0,<3"] - 67 - 68 +[project.optional-dependencies] - 69 +openai = ["openai>=1.0"] # OpenAI + Azure + GitHub Models - 70 +anthropic = ["anthropic>=0.40"] # Claude - 71 +all = ["executionkit[openai,anthropic]"] - 72 +dev = ["pytest>=7.0", "pytest-asyncio>=0.21", "pytest-cov>=4.0", "ruff>=0.4", "mypy>=1.10"] - 73 +``` - 74 +Note: Ollama provider has zero extra deps (stdlib urllib). MockProvider has zero deps. - 75 + - 76 --- - 77 - 78 ## Public API (4 Core Patterns) - - - - -● Now update the "What to Extract" table to include the providers: - -● Updated plan - ⎿ Added 10 lines, removed 1 line - 223 | `patterns/react_loop.py` | `engine/tool_execution.py` | 220-440 | Tool normalization, serialization, execution lo - op | Adapt from registry-based tools to `Tool` dataclass + `LLMProvider` | - 224 | (fallback parser) | `agents/json_extraction.py` | all | Balanced-brace JSON extraction | Use as fallback when pro - vider lacks structured output. 156 lines as-is | - 225 - 226 +### EXTRACT: Built-in Providers - 227 + - 228 +| Target | Source File | Lines | Adaptation | - 229 +|--------|------------|-------|------------| - 230 +| `providers/_openai.py` | `tools/llm/provider_adapters.py` | 472-500 (call_openai) + 55-121 (call_azure_openai) | - +Merge into single class with `base_url` param. Add GitHub Models via base_url. ~70 LOC | - 231 +| `providers/_ollama.py` | `tools/llm/provider_adapters.py` | 16-52 (call_ollama) | Wrap in class implementing LLMP - +rovider Protocol. Keep stdlib urllib. ~50 LOC | - 232 +| `providers/_anthropic.py` | `tools/llm/provider_adapters.py` | 446-469 (call_claude) | Wrap in class. ~50 LOC | - 233 +| `providers/_mock.py` | NEW | — | Canned responses for testing. ~30 LOC | - 234 + - 235 ### WRITE NEW - 236 - 237 | File | Est. LOC | Complexity | Why New | - 238 |------|----------|------------|---------| - 230 -| `provider.py` | 60 | Low | No equivalent — current code uses tied ABC | - 239 +| `provider.py` | 60 | Low | LLMProvider Protocol + LLMResponse dataclass | - 240 | `types.py` | 100 | Low | PatternResult, Branch, CostMetrics, Tool | - 241 | `cost.py` | 120 | Medium | Structured cost-per-pattern tracking | - 242 | `patterns/tree_of_thought.py` | 250 | **High** | Core new value — branch + evaluate + prune + recurse | - - - - - - - - - - -● Now update the Phase 1 to include providers and update the examples: - -● Updated plan - ⎿ Added 6 lines, removed 2 lines - 250 - 251 ## Phase Plan - 252 - 253 -### Phase 1: Foundation (Days 1-3) - 253 +### Phase 1: Foundation + Providers (Days 1-3) - 254 - Scaffold package + pyproject.toml - 255 - `provider.py` — LLMProvider Protocol + LLMResponse - 256 - `types.py` — PatternResult, Branch, CostMetrics, Tool - 257 - `cost.py` — CostTracker - 258 +- `providers/_openai.py` — extract from `provider_adapters.py:472-500`, add base_url for GitHub Models - 259 +- `providers/_ollama.py` — extract from `provider_adapters.py:16-52`, stdlib urllib - 260 +- `providers/_anthropic.py` — extract from `provider_adapters.py:446-469` - 261 +- `providers/_mock.py` — canned responses for testing - 262 - `_engine/context.py` — simplified ExecutionContext (extract from `engine/context.py`) - 263 - `_engine/retry.py` — extract RetryConfig from `engine/step.py:18-68` - 264 - `_engine/parallel.py` — extract gather_bounded from `dag_executor.py` - 265 - `_engine/convergence.py` — write convergence detector - 262 -- Tests: provider protocol, types, cost, convergence, parallel - 266 +- Tests: provider protocol, built-in providers, types, cost, convergence, parallel - 267 - 268 ### Phase 2: Core Patterns (Days 4-8) - 269 Build order by complexity (simpler first): - - - - - - - - -● Now update the verification section: - -● Updated plan - ⎿ Added 24 lines, removed 4 lines - 337 1. `ruff check src/executionkit` — lint passes - 338 2. `mypy --strict src/executionkit` — type check passes - 339 3. `pytest tests/ --cov=executionkit --cov-fail-under=80` — all tests pass, 80%+ coverage - 340 -4. Run `examples/basic_tot.py` with a real provider — produces valid tree with scores - 341 -5. Run `examples/basic_react.py` with mock tools — completes think/act/observe loop - 342 -6. Run `examples/basic_consensus.py` — returns majority vote from 5 samples - 343 -7. Run `examples/basic_refine.py` — converges within max_iterations - 340 +4. Run `examples/quickstart_github.py` with `GITHUB_TOKEN` — 5-line hello world works end-to-end - 341 +5. Run `examples/quickstart_ollama.py` with local Ollama — works with zero cloud deps - 342 +6. Run `examples/basic_tot.py` with a real provider — produces valid tree with scores - 343 +7. Run `examples/basic_react.py` with mock tools — completes think/act/observe loop - 344 +8. Run `examples/basic_consensus.py` — returns majority vote from 5 samples - 345 +9. Run `examples/basic_refine.py` — converges within max_iterations - 346 + - 347 +### Quickstart Smoke Test (the "30-second experience") - 348 + - 349 +```python - 350 +# examples/quickstart_github.py - 351 +from executionkit import consensus - 352 +from executionkit.providers import OpenAIProvider - 353 + - 354 +provider = OpenAIProvider( - 355 + model="gpt-4o-mini", - 356 + base_url="https://models.inference.ai.azure.com", - 357 + api_key=os.environ["GITHUB_TOKEN"], - 358 +) - 359 + - 360 +result = await consensus(provider, "What is 2+2?", num_samples=3) - 361 +print(result.value) # "4" - 362 +print(result.cost) # CostMetrics(input_tokens=45, output_tokens=9, llm_calls=3) - 363 +``` - - - - - - - - -● Plan updated. Here's what changed: - - Added providers/ subpackage with 3 built-in providers + mock: - - ┌───────────────────┬─────────────────────────────────────────────┬───────────────────┬───────────────────────────────────────┐ - │ Provider │ Covers │ Extra deps │ Source │ - ├───────────────────┼─────────────────────────────────────────────┼───────────────────┼───────────────────────────────────────┤ - │ OpenAIProvider │ OpenAI + Azure + GitHub Models/Copilot (via │ openai │ Extract from │ - │ │ base_url) │ │ provider_adapters.py:472-500 │ - ├───────────────────┼─────────────────────────────────────────────┼───────────────────┼───────────────────────────────────────┤ - │ OllamaProvider │ Local models │ None (stdlib │ Extract from │ - │ │ │ urllib) │ provider_adapters.py:16-52 │ - ├───────────────────┼─────────────────────────────────────────────┼───────────────────┼───────────────────────────────────────┤ - │ AnthropicProvider │ Claude │ anthropic │ Extract from │ - │ │ │ │ provider_adapters.py:446-469 │ - ├───────────────────┼─────────────────────────────────────────────┼───────────────────┼───────────────────────────────────────┤ - │ MockProvider │ Testing │ None │ New, ~30 LOC │ - └───────────────────┴─────────────────────────────────────────────┴───────────────────┴───────────────────────────────────────┘ - - The key insight: OpenAIProvider with a base_url param covers 3 services in one class. GitHub Models is just - base_url="https://models.inference.ai.azure.com" + api_key=GITHUB_TOKEN. No separate provider needed. - - The "30-second experience" is now 5 lines: - from executionkit import consensus - from executionkit.providers import OpenAIProvider - - provider = OpenAIProvider("gpt-4o-mini", base_url="https://models.inference.ai.azure.com", api_key=token) - result = await consensus(provider, "What is 2+2?", num_samples=3) - - Each provider is ~50-80 lines — thin wrappers extracted from existing provider_adapters.py, not the full 9-provider monster. Total - maintenance: ~3 providers, not 9. - ⎿ Tool use rejected - -● Got it — standing by for the Ultraplan result. - -✻ Crunched for 2m 3s - -❯ ◇ ultraplan -Starting Claude Code on the web… - -❯ ultraplan: cannot launch remote session — -Background tasks require a git repository. Initialize git or run from a git repository. - -● Looks like Ultraplan needs a git repo to launch a remote session. Your D:\source\prompts directory isn't a git repository. - - Two options: - - 1. Init git in the prompts directory (if you want to): - ! cd D:/source/prompts && git init - 2. Run from a different working directory that already has git — like c:\Users\tandf\source\repos\midnight-automation-voyage - - Which would you prefer? Or if you want to refine the plan manually, just tell me what to change. - -❯ /ultraplan provider sh1 -◇ ultraplan - ⎿ Starting Claude Code on the web… - -❯ ultraplan: cannot launch remote session — -Background tasks require a git repository. Initialize git or run from a git repository. - -● Ultraplan can't launch because D:\source\prompts isn't a git repo. Let me ask how you'd like to proceed. - -● User answered Claude's questions: - ⎿ · Ultraplan needs a git repo to launch remote sessions. How would you like to proceed with the ExecutionKit plan? → init a git - in a subfolder on the c dtive and do it from there - - -● I can't run commands in plan mode. Run these yourself using the ! prefix: - - ! mkdir -p /c/Users/tandf/source/executionkit && cd /c/Users/tandf/source/executionkit && git init && cp - "C:/Users/tandf/.claude/plans/linked-twirling-crystal.md" ./PLAN.md - - Then from that directory you can retry /ultraplan. Or if you'd like me to exit plan mode first so I can set it up for you, just say - the word. - -● User answered Claude's questions: - ⎿ · Should I exit plan mode so I can create the git repo and set things up for you? → I'll do it manually - - -● Run these commands: - - ! mkdir -p /c/Users/tandf/source/executionkit - ! cd /c/Users/tandf/source/executionkit && git init - ! cp "C:/Users/tandf/.claude/plans/linked-twirling-crystal.md" /c/Users/tandf/source/executionkit/PLAN.md - - Then navigate there and retry ultraplan: - ! cd /c/Users/tandf/source/executionkit - - The plan file will be available at /c/Users/tandf/source/executionkit/PLAN.md for the remote session to read. Standing by while you - set it up. - -✻ Baked for 33s - -❯ i am not avble to move you but the file is there can you move yourself now - -● Bash(mkdir -p /c/Users/tandf/source/executionkit && cd /c/Users/tandf/source/executionkit && git init && cp - "C:/Users/tandf/.claude/plans/linked-twirling-crystal.md" ./PLAN.md && ls -la) - ⎿ Initialized empty Git repository in C:/Users/tandf/source/executionkit/.git/ - total 24 - drwxr-xr-x 1 tandf 197609 0 Apr 4 17:20 ./ - drwxr-xr-x 1 tandf 197609 0 Apr 4 17:20 ../ - drwxr-xr-x 1 tandf 197609 0 Apr 4 17:20 .git/ - -rw-r--r-- 1 tandf 197609 15312 Apr 4 17:20 PLAN.md - ⎿ Shell cwd was reset to D:\source\prompts - -● Done. Git repo created at C:\Users\tandf\source\executionkit\ with PLAN.md inside. You can now run /ultraplan from that directory. - - Note: my working directory is still D:\source\prompts — I can't change my own CWD to the new repo. You'd need to either: - 1. Open a new Claude Code session in C:\Users\tandf\source\executionkit\ - 2. Or run /ultraplan pointing to that path - -❯ /ultraplan add any context to help the plan -◇ ultraplan - ⎿ Starting Claude Code on the web… - -❯ ultraplan: cannot launch remote session — -Background tasks require a git repository. Initialize git or run from a git repository. - -● The issue is that ultraplan runs from my current working directory (D:\source\prompts) which isn't a git repo. I can't change my - own CWD mid-session. - - Your options: - - 1. Init git right here (simplest): - ! cd D:/source/prompts && git init - This makes the current directory a git repo so ultraplan can launch. - - 2. Start a new Claude Code session from the executionkit directory: - claude --cwd C:\Users\tandf\source\executionkit - - Want me to init git in D:\source\prompts? It's safe — just creates a .git folder, doesn't affect any files. - -❯ 1 - -● Bash(cd D:/source/prompts && git init) - ⎿ Initialized empty Git repository in D:/source/prompts/.git/ - -● Done. D:\source\prompts is now a git repo. Try /ultraplan again. - -❯ /ultraplan plan this out and add improvements where found -◇ ultraplan - ⎿ Starting Claude Code on the web… - -❯ ultraplan: cannot launch remote session — -Background tasks require a git repository. Initialize git or run from a git repository. - -● Might need at least one commit. Let me add one. - -● Bash(cd D:/source/prompts && git add PLAN.md 2>/dev/null; git add derived-tools.md 2>/dev/null; git status) - ⎿ On branch master - - No commits yet - - Changes to be committed: - (use "git rm --cached ..." to unstage) - new file: derived-tools.md - - Untracked files: - (use "git add ..." to include in what will be committed) - .serena/ - .venv-wsl/ - .vs/ - .vscode/ - __pycache__/ - agentic-v2-eval/ - agentic-workflows-v2/ - artifacts/ - decks-generated/ - docs/ - examples/ - node_modules/ - output/ - presentation/ - prompts_tools.egg-info/ - reports/ - research/ - runs/ - scripts/ - tests/ - tools/ - -● Bash(cd D:/source/prompts && git commit -m "$(cat <<'EOF' - chore: init repo for ultraplan - - Co-Authored-By: Claude Opus 4.6 (1M context) - EOF - )") - ⎿ [master (root-commit) 31a8507] chore: init repo for ultraplan - 1 file changed, 1327 insertions(+) - create mode 100644 derived-tools.md - -● Git repo now has a commit. Try /ultraplan again. - -✻ Crunched for 42s - -❯ /ultraplan - ⎿ Usage: /ultraplan , or include "ultraplan" anywhere - in your prompt - - Remote plan mode with rich web editing experience. - Runs in Claude Code on the web. When the plan is ready, - you can execute it in the web session or send it back here. - You can continue to work while the plan is generated remotely. - - Terms: https://code.claude.com/docs/en/claude-code-on-the-web - -❯ can i see it running on web - -● It looks like /ultraplan printed the usage help but didn't actually launch. You need to include a prompt with it. Try: - - /ultraplan Refine and improve the ExecutionKit plan at C:\Users\tandf\.claude\plans\linked-twirling-crystal.md — a Python library - for composable LLM reasoning patterns (Tree of Thought, ReAct, consensus, refinement loops). Add improvements where found. - - Or just type your prompt after the command on the same line. The help text says "Usage: /ultraplan ". - -❯ /ultraplan Refine and improve the ExecutionKit plan at -C:\Users\tandf\.claude\plans\linked-twirling-crystal.md — a Python library for -composable LLM reasoning patterns (Tree of Thought, ReAct, consensus, refinement -●oSkill(ultraplan)ements where found. - ⎿ Initializing… - ⎿ Error: Skill ultraplan is not a prompt-based skill - -● Ultraplan isn't invokable through the Skill tool — it's a CLI-native command that - launches a remote web session. You need to type it directly in the prompt input, not - as part of a message to me. - - Try typing this directly into your Claude Code prompt (not as a message to me): - - /ultraplan Refine and improve the ExecutionKit plan — a Python library for composable - LLM reasoning patterns (Tree of Thought, ReAct, consensus, refinement loops). Add - improvements where found. - - Make sure the /ultraplan is at the very start of your input line. It should open a - web browser session where you can edit the plan with a rich UI. - - If it still doesn't work, the plan is ready as-is at -❯ /ultraplan Refine and improve the ExecutionKit plan — a Python library for -composable LLM reasoning patterns (Tree of Thought, ReAct, consensus, refinement -loops). Add improvements where found. -● That came through as a message to me rather than a CLI command. The /ultraplan - command needs to be entered at the Claude Code prompt bar itself (where you type), - not sent as a message in the conversation. - - If it's not working in your environment, we have two paths: - - 1. I refine the plan here — tell me what improvements you want and I'll update the - plan file - 2. Start building — the plan is solid enough to begin Phase 1 (foundation + - providers) -❯ provide me with full prompt to provide in claude code aspp insteads of here in -github window so it can execute -● Here's the full prompt to paste into the Claude Code app (not this GitHub window): - - Read the plan at C:\Users\tandf\.claude\plans\linked-twirling-crystal.md and refine it. This is a plan for ExecutionKit — a Python - library offering composable LLM reasoning patterns (Tree of Thought, ReAct, consensus, refinement loops) as first-class primitives. - Positioned as "itertools for LLM reasoning." - - The plan was developed through 4 rounds of agent analysis (13+ agents) including: - - Codebase exploration of D:\source\prompts (23 extractable execution patterns found) - - Market analysis (agentic AI 43.8% CAGR, explicit GitHub demand signals) - - Antagonistic review (3 reviewers killed original "Lithom" concept, pivoted to ExecutionKit) - - Competitive analysis (gap vs LangGraph, DSPy, AutoGen) - - Key existing assets in D:\source\prompts\agentic-workflows-v2\agentic_v2\: - - engine/dag_executor.py — Kahn's DAG with FIRST_COMPLETED async parallelism - - engine/context.py — Hierarchical execution context - - engine/tool_execution.py — ReAct-like tool loop - - engine/step.py — Retry + loop-until patterns - - agents/json_extraction.py — Balanced-brace JSON extraction - - Improve the plan where you find gaps. Focus on: API design, provider integration (built-in OpenAI/Ollama/Anthropic providers), test - strategy, and phased build sequence. The library should let developers spin up true ToT, ReAct, and looping structures with real - LLM calls where Python executes the patterns. - - Copy-paste that entire block into the Claude Code app prompt and hit enter. - /^\ -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── .[||]. -❯ Please commit all of my changes so we can make a PR. [ ✦ ✦ ] -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── [ ==== ] - Opus 4.6 (1M context) [###---------] 27% in:87.5K out:359.4K $18.19 7h 19mnew task? /clear to save 265.9k tokens `------´ - ⏵⏵ accept edits on (shift+tab to cycle) 265418 tokens Kiln - diff --git a/docs/adr/README.md b/docs/adr/README.md new file mode 100644 index 0000000..0f75300 --- /dev/null +++ b/docs/adr/README.md @@ -0,0 +1,20 @@ +# Architecture Decision Records + +Formal decision records for ExecutionKit's key design choices. + +> **Status: Sprint 2 in progress.** ADRs are being extracted from +> [`docs/planning/FINAL_VERDICT.md`](../planning/FINAL_VERDICT.md) and +> [`dev/BUILD_SPEC.md`](../../dev/BUILD_SPEC.md). + +## Planned Records + +| ADR | Decision | Status | +|-----|----------|--------| +| ADR-001 | Structural protocols (PEP 544) over abstract base classes | Pending | +| ADR-002 | Flat package layout over `src/` wrapper | Pending | +| ADR-003 | Single OpenAI-compatible `Provider` over native adapter matrix | Pending | + +## Format + +Records follow the [MADR template](https://adr.github.io/madr/) (Markdown Architectural +Decision Records). Each file is named `NNN-short-title.md`. diff --git a/dev/planning/FINAL_VERDICT.md b/docs/planning/FINAL_VERDICT.md similarity index 100% rename from dev/planning/FINAL_VERDICT.md rename to docs/planning/FINAL_VERDICT.md diff --git a/dev/planning/MVP_SUMMARY.md b/docs/planning/MVP_SUMMARY.md similarity index 100% rename from dev/planning/MVP_SUMMARY.md rename to docs/planning/MVP_SUMMARY.md diff --git a/dev/planning/MVP_TIERS.md b/docs/planning/MVP_TIERS.md similarity index 100% rename from dev/planning/MVP_TIERS.md rename to docs/planning/MVP_TIERS.md diff --git a/dev/planning/PLAN.md b/docs/planning/PLAN.md similarity index 100% rename from dev/planning/PLAN.md rename to docs/planning/PLAN.md diff --git a/dev/planning/PLAN_SIMPLE.md b/docs/planning/PLAN_SIMPLE.md similarity index 100% rename from dev/planning/PLAN_SIMPLE.md rename to docs/planning/PLAN_SIMPLE.md diff --git a/dev/planning/QUICK_REFERENCE.md b/docs/planning/QUICK_REFERENCE.md similarity index 100% rename from dev/planning/QUICK_REFERENCE.md rename to docs/planning/QUICK_REFERENCE.md diff --git a/docs/planning/README.md b/docs/planning/README.md new file mode 100644 index 0000000..5d37fb0 --- /dev/null +++ b/docs/planning/README.md @@ -0,0 +1,29 @@ +# Historical Planning Artifacts + +> **Status: Historical.** These documents capture the multi-agent design and +> decision process that produced ExecutionKit v0.1. They are **not** active specs. +> +> For current architecture and design rationale, see: +> - [`docs/architecture.md`](../architecture.md) — module map, layering, data flow +> - [`docs/adr/`](../adr/) — formal Architecture Decision Records (when added) +> - [`CONTRIBUTING.md`](../../CONTRIBUTING.md) — active development guidelines +> +> The decisions that survived the planning process are extracted into ADRs. +> The files here serve as primary sources for that extraction — not as guidance +> for contributors. + +## File Index + +| File | What it contains | +|------|-----------------| +| `FINAL_VERDICT.md` | 3-iteration × 3-agent synthesis; items that survived all rounds | +| `SHIP_DECISION.md` | Go/no-go criteria across three delivery tiers | +| `PLAN.md` | Full build specification with multi-agent review history | +| `PLAN_SIMPLE.md` | Condensed version of PLAN.md | +| `MVP_SUMMARY.md` | Scope summary for the v0.1 MVP | +| `MVP_TIERS.md` | Tier 1 / 2 / 3 feature breakdown | +| `REVIEW_ITERATION_1/2/3.md` | Per-round review findings from Market, Technical, and Scope agents | +| `REVIEW_AUDIT.md` | Cross-iteration consistency check | +| `QUICK_REFERENCE.md` | Single-page decision summary | +| `README_MVP.md` | Draft README from the pre-build planning phase | +| `TIER1_SCAFFOLD.md` | Scaffold spec for the minimum viable slice | diff --git a/dev/planning/README_MVP.md b/docs/planning/README_MVP.md similarity index 100% rename from dev/planning/README_MVP.md rename to docs/planning/README_MVP.md diff --git a/dev/planning/REVIEW_AUDIT.md b/docs/planning/REVIEW_AUDIT.md similarity index 100% rename from dev/planning/REVIEW_AUDIT.md rename to docs/planning/REVIEW_AUDIT.md diff --git a/dev/planning/REVIEW_ITERATION_1.md b/docs/planning/REVIEW_ITERATION_1.md similarity index 100% rename from dev/planning/REVIEW_ITERATION_1.md rename to docs/planning/REVIEW_ITERATION_1.md diff --git a/dev/planning/REVIEW_ITERATION_2.md b/docs/planning/REVIEW_ITERATION_2.md similarity index 100% rename from dev/planning/REVIEW_ITERATION_2.md rename to docs/planning/REVIEW_ITERATION_2.md diff --git a/dev/planning/REVIEW_ITERATION_3.md b/docs/planning/REVIEW_ITERATION_3.md similarity index 100% rename from dev/planning/REVIEW_ITERATION_3.md rename to docs/planning/REVIEW_ITERATION_3.md diff --git a/dev/planning/SHIP_DECISION.md b/docs/planning/SHIP_DECISION.md similarity index 100% rename from dev/planning/SHIP_DECISION.md rename to docs/planning/SHIP_DECISION.md diff --git a/dev/planning/TIER1_SCAFFOLD.md b/docs/planning/TIER1_SCAFFOLD.md similarity index 100% rename from dev/planning/TIER1_SCAFFOLD.md rename to docs/planning/TIER1_SCAFFOLD.md diff --git a/.full-review/00-scope.md b/docs/review-process/00-scope.md similarity index 100% rename from .full-review/00-scope.md rename to docs/review-process/00-scope.md diff --git a/.full-review/01-quality-architecture.md b/docs/review-process/01-quality-architecture.md similarity index 100% rename from .full-review/01-quality-architecture.md rename to docs/review-process/01-quality-architecture.md diff --git a/.full-review/02-security-performance.md b/docs/review-process/02-security-performance.md similarity index 100% rename from .full-review/02-security-performance.md rename to docs/review-process/02-security-performance.md diff --git a/.full-review/03-testing-documentation.md b/docs/review-process/03-testing-documentation.md similarity index 100% rename from .full-review/03-testing-documentation.md rename to docs/review-process/03-testing-documentation.md diff --git a/.full-review/04-best-practices.md b/docs/review-process/04-best-practices.md similarity index 100% rename from .full-review/04-best-practices.md rename to docs/review-process/04-best-practices.md diff --git a/.full-review/05-final-report.md b/docs/review-process/05-final-report.md similarity index 100% rename from .full-review/05-final-report.md rename to docs/review-process/05-final-report.md diff --git a/.full-review/1a-code-quality.md b/docs/review-process/1a-code-quality.md similarity index 100% rename from .full-review/1a-code-quality.md rename to docs/review-process/1a-code-quality.md diff --git a/.full-review/1b-architecture.md b/docs/review-process/1b-architecture.md similarity index 100% rename from .full-review/1b-architecture.md rename to docs/review-process/1b-architecture.md diff --git a/.full-review/2a-security.md b/docs/review-process/2a-security.md similarity index 100% rename from .full-review/2a-security.md rename to docs/review-process/2a-security.md diff --git a/.full-review/2b-performance.md b/docs/review-process/2b-performance.md similarity index 100% rename from .full-review/2b-performance.md rename to docs/review-process/2b-performance.md diff --git a/.full-review/3a-testing.md b/docs/review-process/3a-testing.md similarity index 100% rename from .full-review/3a-testing.md rename to docs/review-process/3a-testing.md diff --git a/.full-review/3b-documentation.md b/docs/review-process/3b-documentation.md similarity index 100% rename from .full-review/3b-documentation.md rename to docs/review-process/3b-documentation.md diff --git a/.full-review/4a-best-practices.md b/docs/review-process/4a-best-practices.md similarity index 100% rename from .full-review/4a-best-practices.md rename to docs/review-process/4a-best-practices.md diff --git a/.full-review/4b-cicd.md b/docs/review-process/4b-cicd.md similarity index 100% rename from .full-review/4b-cicd.md rename to docs/review-process/4b-cicd.md diff --git a/.full-review/README.md b/docs/review-process/README.md similarity index 100% rename from .full-review/README.md rename to docs/review-process/README.md diff --git a/.full-review/SECURITY_AUDIT.md b/docs/review-process/SECURITY_AUDIT.md similarity index 100% rename from .full-review/SECURITY_AUDIT.md rename to docs/review-process/SECURITY_AUDIT.md diff --git a/.full-review/code-quality-review.md b/docs/review-process/code-quality-review.md similarity index 100% rename from .full-review/code-quality-review.md rename to docs/review-process/code-quality-review.md From e3335a72c4d92d916d97e136d84f906f34536514 Mon Sep 17 00:00:00 2001 From: tafreeman Date: Mon, 11 May 2026 20:58:00 -0500 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20portfolio=20sprint=202=20=E2=80=94?= =?UTF-8?q?=20principal-grade=20artifacts=20and=20supply-chain=20hardening?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADRs (PB-02): - docs/adr/001-structural-protocols.md: PEP 544 protocols over ABC - docs/adr/002-flat-layout.md: flat layout over src/ wrapper - docs/adr/003-single-provider.md: single OpenAI-compatible Provider over adapter matrix - docs/adr/README.md: replace placeholder stub with proper index table Supply-chain security: - requirements.lock: pin all 30 dev deps via uv pip compile (PB-08) - .github/workflows/ci.yml: add pip-audit step to security job (PB-08) - .github/workflows/codeql.yml: new CodeQL SAST workflow for Python (PB-09) - sbom.json: CycloneDX 1.6 SBOM, 372 components (PB-10) - .github/workflows/publish.yml: regenerate SBOM on each release (PB-10) Type coverage (PB-15): - pyproject.toml: remove examples/ from mypy --strict exclusion list - examples/react_tool_use.py: fix 5 mypy errors (split _SAFE_OPS into typed Callable dicts, annotate provider params as ToolCallingProvider); fix 3 ruff errors (UP035 Callable import, TC006 cast quote) Note: PB-11 (OIDC trusted publishing) was already implemented in publish.yml. Sprint 2 Definition of Done: - 387 tests pass, 85% coverage - mypy --strict clean across 26 source files (executionkit/ + examples/) - ruff clean across all files Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/ci.yml | 3 + .github/workflows/codeql.yml | 35 + .github/workflows/publish.yml | 11 + docs/adr/001-structural-protocols.md | 63 + docs/adr/002-flat-layout.md | 60 + docs/adr/003-single-provider.md | 60 + docs/adr/README.md | 24 +- examples/react_tool_use.py | 34 +- pyproject.toml | 2 +- requirements.lock | 81 + sbom.json | 15414 +++++++++++++++++++++++++ 11 files changed, 15760 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/codeql.yml create mode 100644 docs/adr/001-structural-protocols.md create mode 100644 docs/adr/002-flat-layout.md create mode 100644 docs/adr/003-single-provider.md create mode 100644 requirements.lock create mode 100644 sbom.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc97cfb..bbc6546 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,3 +65,6 @@ jobs: - name: Run Bandit SAST scan run: bandit -r executionkit/ -c pyproject.toml + + - name: Dependency audit (pip-audit) + run: pip install pip-audit && pip-audit --requirement requirements.lock diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..dc97d59 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,35 @@ +name: "CodeQL" + +on: + push: + branches: [main] + pull_request: + branches: [main] + schedule: + - cron: "30 1 * * 0" + +jobs: + analyze: + name: CodeQL Analysis + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + steps: + - uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: python + queries: security-extended + + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:python" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 483b8c3..5a51a4a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -53,6 +53,17 @@ jobs: - name: Install build tools run: pip install build + - name: Generate SBOM + run: | + pip install cyclonedx-bom + cyclonedx-py environment --of JSON --output-file sbom.json + + - name: Upload SBOM artifact + uses: actions/upload-artifact@v4 + with: + name: sbom + path: sbom.json + - name: Build wheel and sdist run: python -m build diff --git a/docs/adr/001-structural-protocols.md b/docs/adr/001-structural-protocols.md new file mode 100644 index 0000000..d2f793f --- /dev/null +++ b/docs/adr/001-structural-protocols.md @@ -0,0 +1,63 @@ +# ADR-001: Structural Protocols over Abstract Base Classes + +**Date:** 2026-05-11 +**Status:** Accepted +**Deciders:** ExecutionKit core team +**Technical Story:** During the v0.1 design review, the team needed to define the `LLMProvider` and `ToolCallingProvider` interfaces in a way that supported test doubles, custom implementations, and third-party clients without requiring inheritance from ExecutionKit base classes. + +--- + +## Context and Problem Statement + +ExecutionKit's three reasoning patterns (`consensus`, `refine_loop`, `react_loop`) each accept an `LLMProvider` as their first argument. The project needed a formal interface definition for this parameter — something that enforces the required `complete()` method signature and makes the type checkable. + +Two approaches were available: Python's Abstract Base Classes (ABCs) from `abc.ABC`, or structural protocols from `typing.Protocol` (PEP 544, Python 3.8+). The choice has significant downstream effects on how users and test authors interact with the library. + +The choice also interacts with a core design principle: zero runtime dependencies. The interface mechanism must not require any user-side import of ExecutionKit internals just to satisfy the interface. + +## Decision Drivers + +* Users should be able to pass any object with the right `complete()` method, without inheriting from an ExecutionKit class. +* The `MockProvider` test double must satisfy the interface without being coupled to the production protocol definition. +* Third-party clients (e.g., a wrapper around an Anthropic client) must satisfy the interface without modification. +* `isinstance()` checks must work at runtime for internal guards in `_TrackedProvider`. +* The zero-runtime-dependency design principle must not be compromised. + +## Considered Options + +* Option A: PEP 544 structural protocols (`typing.Protocol`) +* Option B: Abstract base classes (`abc.ABC` / `abc.ABCMeta`) + +## Decision Outcome + +**Chosen option:** Option A (structural protocols), because structural typing lets any conforming object satisfy the interface through duck typing while still enabling `isinstance()` checks via `@runtime_checkable`. Users and test authors never need to import or inherit from ExecutionKit classes. + +### Positive Consequences + +* Any object with the right method signatures satisfies `LLMProvider` — including `MockProvider`, custom wrappers, and third-party clients. +* `@runtime_checkable` enables `isinstance(provider, LLMProvider)` checks inside `_TrackedProvider.supports_tools` without requiring inheritance. +* Users implementing custom providers need zero imports from ExecutionKit at definition time; they only need to match the method signature. +* Consistent with Python's own standard library (`collections.abc`, `asyncio.Transport`) and popular third-party libraries. + +### Negative Consequences + +* IDEs may not always infer protocol conformance as clearly as ABC inheritance in all tool chains. +* Structural conformance is checked by type checkers (mypy) and at `isinstance()` call sites; a class with a subtly wrong signature silently does not conform rather than raising at class definition time. + +## Pros and Cons of the Options + +### Option A: Structural protocols (`typing.Protocol`) + +* **Good:** Zero coupling — conforming objects need not import the protocol definition. +* **Good:** Satisfies the zero-dependency principle — no ExecutionKit imports required on the user side. +* **Good:** `@runtime_checkable` preserves `isinstance()` capability where needed. +* **Good:** Aligns with how Python's own stdlib defines abstract interfaces. +* **Bad:** Missing-method errors surface at call time or type-check time, not at class definition time. + +### Option B: Abstract base classes (`abc.ABC`) + +* **Good:** Subclasses that omit required methods raise `TypeError` immediately at instantiation. +* **Good:** IDE support for abstract method discovery is mature. +* **Bad:** Users must inherit from `ExecutionKit`'s `LLMProvider` ABC, coupling their code to our class hierarchy. +* **Bad:** Third-party clients cannot satisfy the interface without modification or a shim subclass. +* **Bad:** Contradicts the zero-dependency design — satisfying the interface requires importing from `executionkit`. diff --git a/docs/adr/002-flat-layout.md b/docs/adr/002-flat-layout.md new file mode 100644 index 0000000..17bd131 --- /dev/null +++ b/docs/adr/002-flat-layout.md @@ -0,0 +1,60 @@ +# ADR-002: Flat Package Layout over src/ Wrapper + +**Date:** 2026-05-11 +**Status:** Accepted +**Deciders:** ExecutionKit core team +**Technical Story:** When initialising the repository structure, the team chose between placing `executionkit/` directly at the repo root (flat layout) or nesting it under a `src/` directory (src layout), a choice that affects developer ergonomics and install behaviour. + +--- + +## Context and Problem Statement + +Python projects can organise their package source in two common ways: the "flat" layout places the package directory at the repository root (`executionkit/` alongside `tests/` and `pyproject.toml`), while the "src" layout wraps it in an intermediate directory (`src/executionkit/`). Both are supported by modern build backends including Hatchling. + +The src layout was designed to prevent a specific class of bug: accidentally importing the uninstalled source tree when `import executionkit` is run from the repo root, which can mask installation failures. The flat layout trades that protection for a simpler directory tree and faster development setup. + +The right choice depends on the project's complexity, the depth of its dependency tree, and how it expects contributors to work. + +## Decision Drivers + +* New contributors should be able to run `pip install -e . && pytest` immediately after cloning with no extra steps. +* The library has zero required runtime dependencies, which eliminates the main risk scenario the src layout is designed to prevent. +* Consistency with widely-used Python OSS libraries reduces friction for experienced contributors. +* Simplicity is a first-class value; layout complexity must justify itself. + +## Considered Options + +* Option A: Flat layout (`executionkit/` at repo root) +* Option B: src layout (`src/executionkit/`) + +## Decision Outcome + +**Chosen option:** Option A (flat layout), because the primary benefit of the src layout — preventing accidental shadowing of installed packages — does not apply to a library with zero runtime dependencies. The flat layout removes one directory of indirection and matches the conventions of the Python libraries ExecutionKit is most similar to. + +### Positive Consequences + +* `import executionkit` resolves correctly immediately after `git clone && pip install -e .` with no path manipulation. +* Simpler directory tree — contributors immediately see `executionkit/` alongside `tests/` without navigating into `src/`. +* Consistent with the conventions of `requests`, `click`, `httpx`, and `attrs`, which share the zero-or-minimal-dependency profile. + +### Negative Consequences + +* Running `python -c "import executionkit"` from the repo root without installing first will succeed by accident (imports the source tree directly). This can mask a broken `pyproject.toml` entry point during development. +* If a future version adds heavy runtime dependencies with complex transitive trees, the src layout's shadow-prevention benefit becomes more relevant and this decision should be revisited. + +## Pros and Cons of the Options + +### Option A: Flat layout + +* **Good:** Zero-friction setup — no editable-install tricks or PYTHONPATH manipulation needed. +* **Good:** Matches the established convention for minimal Python libraries. +* **Good:** One fewer directory level in navigation and import paths. +* **Bad:** The uninstalled source tree is importable from the repo root, which can hide packaging problems. + +### Option B: src layout + +* **Good:** Forces contributors to install before importing, surfacing packaging issues early. +* **Good:** Prevents accidental shadowing of a different installed version of the library. +* **Bad:** Adds a `src/` directory that serves no purpose for a zero-dependency library. +* **Bad:** Diverges from the conventions of well-known minimal Python libraries without a countervailing benefit. +* **Bad:** Requires contributors to understand why the extra directory exists before they can reason about the layout. diff --git a/docs/adr/003-single-provider.md b/docs/adr/003-single-provider.md new file mode 100644 index 0000000..1bc3aa2 --- /dev/null +++ b/docs/adr/003-single-provider.md @@ -0,0 +1,60 @@ +# ADR-003: Single OpenAI-Compatible Provider over Native Adapter Matrix + +**Date:** 2026-05-11 +**Status:** Accepted +**Deciders:** ExecutionKit core team +**Technical Story:** The v0.1 scope review identified "provider-matrix creep" as one of three named anti-scope guardrails; the team locked the provider design to a single `Provider` class targeting the OpenAI-compatible `/chat/completions` endpoint, deferring any native adapters to a future release. + +--- + +## Context and Problem Statement + +LLM libraries commonly provide a separate adapter for each major provider (OpenAI, Anthropic, Gemini, Cohere, etc.), each handling the provider's unique request format, authentication scheme, and response shape. This approach maximises out-of-the-box compatibility but creates a permanent maintenance commitment: every new provider model, API version, or format change requires a library update. + +ExecutionKit needed to decide how broad its provider support should be at v0.1. The library's value proposition is composable reasoning patterns with budget awareness — not provider portability. A large adapter matrix would shift the identity of the project toward "universal gateway", which is explicitly out of scope. + +## Decision Drivers + +* Provider-matrix creep is one of three named Anti-Scope Guardrails in the build specification; the team committed to rejecting it at design time. +* The OpenAI `/chat/completions` JSON format has become a de facto standard: OpenAI, Ollama, LM Studio, vLLM, Azure OpenAI, Groq, Mistral, Fireworks, Together AI, and GitHub Models all expose a compatible endpoint. +* Each native adapter (Anthropic Messages API, Gemini GenerateContent, etc.) requires ongoing maintenance and testing against a live API. +* The `LLMProvider` structural protocol allows users to implement their own adapters without any changes to ExecutionKit. + +## Considered Options + +* Option A: Single `Provider` class targeting the OpenAI-compatible HTTP API +* Option B: Native adapter per major provider (OpenAI, Anthropic, Gemini, Ollama, ...) + +## Decision Outcome + +**Chosen option:** Option A (single Provider), because one class targeting the OpenAI-compatible format reaches the majority of commercial and local LLM endpoints with no additional code. Anthropic native support is deferred to v0.2, where a message-format converter can be added cleanly. Users who need Anthropic today can route through a compatible proxy such as LiteLLM. + +### Positive Consequences + +* A single `Provider(base_url, api_key, model)` constructor works against OpenAI, Ollama, Groq, Azure OpenAI, Together AI, LM Studio, vLLM, and any other OpenAI-compatible endpoint — zero configuration change required between them. +* The library's identity stays focused on reasoning patterns, not provider plumbing. +* Eliminates an entire class of maintenance work: no per-provider test suites, no per-provider API version tracking. +* Users can implement their own `LLMProvider`-conforming adapter for any non-compatible provider without waiting for a library release. + +### Negative Consequences + +* Anthropic's Claude models are not directly supported in v0.1. Users need LiteLLM or a compatible proxy as a stopgap. +* Providers whose responses deviate from the OpenAI JSON shape (non-standard field names, missing `usage`, etc.) require workarounds in the single provider's response parser. +* The decision to defer Anthropic was scope-driven, not technical; this creates an expectation of native support in v0.2 that must be managed. + +## Pros and Cons of the Options + +### Option A: Single OpenAI-compatible Provider + +* **Good:** One class covers the majority of endpoints in use today (OpenAI, Groq, Azure, Ollama, vLLM, LM Studio, Together AI, Fireworks, Mistral, GitHub Models). +* **Good:** Zero maintenance overhead for providers that don't need their own adapter. +* **Good:** The `LLMProvider` protocol acts as an extension point — anyone can implement a native adapter as a drop-in without forking the library. +* **Bad:** Anthropic and Gemini native APIs are not covered; users need a proxy or a custom implementation. + +### Option B: Native adapter matrix + +* **Good:** Out-of-the-box support for all major providers without a proxy. +* **Good:** Each adapter can take advantage of provider-specific features (extended thinking, grounding, cached content headers, etc.). +* **Bad:** Each adapter is a permanent maintenance commitment: API versions change, authentication schemes update, response shapes diverge. +* **Bad:** Positions the library as a provider gateway, which is explicitly outside its scope and competes with LiteLLM and the OpenAI Agents SDK. +* **Bad:** "Supports everything" messaging is listed as a de-emphasis guardrail in the build specification; building the matrix contradicts the project's stated positioning. diff --git a/docs/adr/README.md b/docs/adr/README.md index 0f75300..8dad804 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -1,20 +1,18 @@ # Architecture Decision Records -Formal decision records for ExecutionKit's key design choices. +Formal records of significant design decisions made during ExecutionKit's development. +Records follow the [MADR template](https://adr.github.io/madr/). -> **Status: Sprint 2 in progress.** ADRs are being extracted from -> [`docs/planning/FINAL_VERDICT.md`](../planning/FINAL_VERDICT.md) and -> [`dev/BUILD_SPEC.md`](../../dev/BUILD_SPEC.md). +## Records -## Planned Records - -| ADR | Decision | Status | -|-----|----------|--------| -| ADR-001 | Structural protocols (PEP 544) over abstract base classes | Pending | -| ADR-002 | Flat package layout over `src/` wrapper | Pending | -| ADR-003 | Single OpenAI-compatible `Provider` over native adapter matrix | Pending | +| ADR | Decision | Status | Date | +|-----|----------|--------|------| +| [ADR-001](001-structural-protocols.md) | Structural protocols over ABC | Accepted | 2026-05-11 | +| [ADR-002](002-flat-layout.md) | Flat package layout over src/ | Accepted | 2026-05-11 | +| [ADR-003](003-single-provider.md) | Single OpenAI-compatible Provider over adapter matrix | Accepted | 2026-05-11 | ## Format -Records follow the [MADR template](https://adr.github.io/madr/) (Markdown Architectural -Decision Records). Each file is named `NNN-short-title.md`. +Each ADR file is named `NNN-short-title.md` and follows the +[MADR template](https://adr.github.io/madr/). Status values: +**Proposed** → **Accepted** / **Deprecated** / **Superseded**. diff --git a/examples/react_tool_use.py b/examples/react_tool_use.py index a0edc48..15807fb 100644 --- a/examples/react_tool_use.py +++ b/examples/react_tool_use.py @@ -12,17 +12,22 @@ import asyncio import operator as _op import os -from typing import Any +from collections.abc import Callable +from typing import cast from executionkit import Provider, react_loop +from executionkit.provider import ToolCallingProvider from executionkit.types import Tool -_SAFE_OPS: dict[type, Any] = { +_BIN_OPS: dict[type, Callable[[float, float], float]] = { ast.Add: _op.add, ast.Sub: _op.sub, ast.Mult: _op.mul, ast.Div: _op.truediv, ast.Pow: _op.pow, +} + +_UNARY_OPS: dict[type, Callable[[float], float]] = { ast.USub: _op.neg, } @@ -33,10 +38,10 @@ def _safe_eval(expression: str) -> float: def _eval(node: ast.expr) -> float: if isinstance(node, ast.Constant) and isinstance(node.value, (int, float)): return float(node.value) - if isinstance(node, ast.BinOp) and type(node.op) in _SAFE_OPS: - return _SAFE_OPS[type(node.op)](_eval(node.left), _eval(node.right)) - if isinstance(node, ast.UnaryOp) and type(node.op) in _SAFE_OPS: - return _SAFE_OPS[type(node.op)](_eval(node.operand)) + if isinstance(node, ast.BinOp) and type(node.op) in _BIN_OPS: + return _BIN_OPS[type(node.op)](_eval(node.left), _eval(node.right)) + if isinstance(node, ast.UnaryOp) and type(node.op) in _UNARY_OPS: + return _UNARY_OPS[type(node.op)](_eval(node.operand)) raise ValueError(f"Unsafe expression: {ast.dump(node)}") tree = ast.parse(expression, mode="eval") @@ -124,7 +129,7 @@ async def _weather_lookup(city: str) -> str: # --------------------------------------------------------------------------- -async def calculator_example(provider: Provider) -> None: +async def calculator_example(provider: ToolCallingProvider) -> None: print("--- Calculator tool ---") result = await react_loop( provider, @@ -139,7 +144,7 @@ async def calculator_example(provider: Provider) -> None: print() -async def weather_example(provider: Provider) -> None: +async def weather_example(provider: ToolCallingProvider) -> None: print("--- Weather lookup tool ---") result = await react_loop( provider, @@ -154,7 +159,7 @@ async def weather_example(provider: Provider) -> None: print() -async def multi_tool_example(provider: Provider) -> None: +async def multi_tool_example(provider: ToolCallingProvider) -> None: print("--- Multiple tools together ---") result = await react_loop( provider, @@ -172,10 +177,13 @@ async def multi_tool_example(provider: Provider) -> None: async def main() -> None: - provider = Provider( - base_url="https://api.openai.com/v1", - api_key=os.environ["OPENAI_API_KEY"], - model="gpt-4o-mini", + provider = cast( + "ToolCallingProvider", + Provider( + base_url="https://api.openai.com/v1", + api_key=os.environ["OPENAI_API_KEY"], + model="gpt-4o-mini", + ), ) await calculator_example(provider) diff --git a/pyproject.toml b/pyproject.toml index 2b67d6b..d4bf6bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,4 +104,4 @@ skips = [ [tool.mypy] python_version = "3.11" strict = true -exclude = ["tests/", "examples/"] +exclude = ["tests/"] diff --git a/requirements.lock b/requirements.lock new file mode 100644 index 0000000..cee9bbe --- /dev/null +++ b/requirements.lock @@ -0,0 +1,81 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile pyproject.toml --extra dev -o requirements.lock +anyio==4.13.0 + # via httpx +ast-serialize==0.3.0 + # via mypy +bandit==1.9.4 + # via executionkit (pyproject.toml) +build==1.5.0 + # via executionkit (pyproject.toml) +certifi==2026.4.22 + # via + # httpcore + # httpx +colorama==0.4.6 + # via + # bandit + # build + # pytest +coverage==7.14.0 + # via pytest-cov +h11==0.16.0 + # via httpcore +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via executionkit (pyproject.toml) +idna==3.14 + # via + # anyio + # httpx +iniconfig==2.3.0 + # via pytest +librt==0.11.0 + # via mypy +markdown-it-py==4.2.0 + # via rich +mdurl==0.1.2 + # via markdown-it-py +mypy==2.1.0 + # via executionkit (pyproject.toml) +mypy-extensions==1.1.0 + # via mypy +packaging==26.2 + # via + # build + # pytest +pathspec==1.1.1 + # via mypy +pluggy==1.6.0 + # via + # pytest + # pytest-cov +pygments==2.20.0 + # via + # pytest + # rich +pyproject-hooks==1.2.0 + # via build +pytest==9.0.3 + # via + # executionkit (pyproject.toml) + # pytest-asyncio + # pytest-cov +pytest-asyncio==1.3.0 + # via executionkit (pyproject.toml) +pytest-cov==7.1.0 + # via executionkit (pyproject.toml) +pyyaml==6.0.3 + # via bandit +rich==15.0.0 + # via bandit +ruff==0.15.12 + # via executionkit (pyproject.toml) +stevedore==5.7.0 + # via bandit +typing-extensions==4.15.0 + # via + # anyio + # mypy + # pytest-asyncio diff --git a/sbom.json b/sbom.json new file mode 100644 index 0000000..e71aa79 --- /dev/null +++ b/sbom.json @@ -0,0 +1,15414 @@ +{ + "components": [ + { + "bom-ref": "Authlib==1.6.5", + "description": "The ultimate Python library in building OAuth and OpenID Connect servers and clients.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.authlib.org/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/authlib/authlib/issues" + }, + { + "comment": "from packaging metadata Project-URL: Purchase", + "type": "other", + "url": "https://authlib.org/plans" + }, + { + "comment": "from packaging metadata Project-URL: Blog", + "type": "other", + "url": "https://blog.authlib.org/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/authlib/authlib" + }, + { + "comment": "from packaging metadata Project-URL: Donate", + "type": "other", + "url": "https://github.com/sponsors/lepture" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "Authlib", + "purl": "pkg:pypi/authlib@1.6.5", + "type": "library", + "version": "1.6.5" + }, + { + "bom-ref": "EditorConfig==0.17.1", + "description": "EditorConfig File Locator and Interpreter for Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/editorconfig/editorconfig-core-py/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/editorconfig/editorconfig-core-py" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://editorconfig.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "PSF-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "id": "Python-2.0" + } + } + ], + "name": "EditorConfig", + "purl": "pkg:pypi/editorconfig@0.17.1", + "type": "library", + "version": "0.17.1" + }, + { + "bom-ref": "Flask==3.1.2", + "description": "A simple framework for building complex web applications.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Chat", + "type": "chat", + "url": "https://discord.gg/pallets" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://flask.palletsprojects.com/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pallets/flask/" + }, + { + "comment": "from packaging metadata Project-URL: Donate", + "type": "other", + "url": "https://palletsprojects.com/donate" + }, + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://flask.palletsprojects.com/page/changes/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "Flask", + "purl": "pkg:pypi/flask@3.1.2", + "type": "library", + "version": "3.1.2" + }, + { + "bom-ref": "GitPython==3.1.45", + "description": "GitPython is a Python library used to interact with Git repositories", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/gitpython-developers/GitPython" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "GitPython", + "purl": "pkg:pypi/gitpython@3.1.45", + "type": "library", + "version": "3.1.45" + }, + { + "bom-ref": "Jinja2==3.1.6", + "description": "A very fast and expressive template engine.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Chat", + "type": "chat", + "url": "https://discord.gg/pallets" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://jinja.palletsprojects.com/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pallets/jinja/" + }, + { + "comment": "from packaging metadata Project-URL: Donate", + "type": "other", + "url": "https://palletsprojects.com/donate" + }, + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://jinja.palletsprojects.com/changes/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "Jinja2", + "purl": "pkg:pypi/jinja2@3.1.6", + "type": "library", + "version": "3.1.6" + }, + { + "bom-ref": "Mako==1.3.10", + "description": "A super-fast templating language that borrows the best ideas from the existing templating languages.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.makotemplates.org" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/sqlalchemy/mako" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://www.makotemplates.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "Mako", + "purl": "pkg:pypi/mako@1.3.10", + "type": "library", + "version": "1.3.10" + }, + { + "bom-ref": "Markdown==3.10.2", + "description": "Python implementation of John Gruber's Markdown.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://Python-Markdown.github.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/Python-Markdown/markdown/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://python-markdown.github.io/changelog/" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/Python-Markdown/markdown" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://Python-Markdown.github.io/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "Markdown", + "purl": "pkg:pypi/markdown@3.10.2", + "type": "library", + "version": "3.10.2" + }, + { + "bom-ref": "MarkupSafe==3.0.3", + "description": "Safely add untrusted strings to HTML/XML markup.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Chat", + "type": "chat", + "url": "https://discord.gg/pallets" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://markupsafe.palletsprojects.com/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pallets/markupsafe/" + }, + { + "comment": "from packaging metadata Project-URL: Donate", + "type": "other", + "url": "https://palletsprojects.com/donate" + }, + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://markupsafe.palletsprojects.com/page/changes/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "MarkupSafe", + "purl": "pkg:pypi/markupsafe@3.0.3", + "type": "library", + "version": "3.0.3" + }, + { + "bom-ref": "PyJWT==2.10.1", + "description": "JSON Web Token implementation in Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/jpadilla/pyjwt" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "PyJWT", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "crypto" + } + ], + "purl": "pkg:pypi/pyjwt@2.10.1", + "type": "library", + "version": "2.10.1" + }, + { + "bom-ref": "PyMuPDF==1.27.2.3", + "description": "A high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pymupdf.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/pymupdf/PyMuPDF/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pymupdf/pymupdf" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://pymupdf.readthedocs.io/en/latest/changes.html" + } + ], + "name": "PyMuPDF", + "purl": "pkg:pypi/pymupdf@1.27.2.3", + "type": "library", + "version": "1.27.2.3" + }, + { + "bom-ref": "PySocks==1.7.1", + "description": "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Anorov/PySocks" + } + ], + "name": "PySocks", + "purl": "pkg:pypi/pysocks@1.7.1", + "type": "library", + "version": "1.7.1" + }, + { + "bom-ref": "PyYAML==6.0.3", + "description": "YAML parser and emitter for Python", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://pypi.org/project/PyYAML/" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pyyaml.org/wiki/PyYAMLDocumentation" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/yaml/pyyaml/issues" + }, + { + "comment": "from packaging metadata Project-URL: Mailing lists", + "type": "other", + "url": "http://lists.sourceforge.net/lists/listinfo/yaml-core" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/yaml/pyyaml" + }, + { + "comment": "from packaging metadata Project-URL: CI", + "type": "other", + "url": "https://github.com/yaml/pyyaml/actions" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://pyyaml.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "PyYAML", + "purl": "pkg:pypi/pyyaml@6.0.3", + "type": "library", + "version": "6.0.3" + }, + { + "bom-ref": "Pygments==2.19.2", + "description": "Pygments is a syntax highlighting package written in Python.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pygments.org/docs" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/pygments/pygments/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pygments/pygments" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/pygments/pygments/blob/master/CHANGES" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://pygments.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-2-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "Pygments", + "purl": "pkg:pypi/pygments@2.19.2", + "type": "library", + "version": "2.19.2" + }, + { + "bom-ref": "SQLAlchemy==2.0.44", + "description": "Database Abstraction Library", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.sqlalchemy.org" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/sqlalchemy/sqlalchemy/" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://www.sqlalchemy.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "SQLAlchemy", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "asyncio" + } + ], + "purl": "pkg:pypi/sqlalchemy@2.0.44", + "type": "library", + "version": "2.0.44" + }, + { + "bom-ref": "Werkzeug==3.1.3", + "description": "The comprehensive WSGI web application library.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Chat", + "type": "chat", + "url": "https://discord.gg/pallets" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://werkzeug.palletsprojects.com/" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/pallets/werkzeug/issues/" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/pallets/werkzeug/" + }, + { + "comment": "from packaging metadata Project-URL: Donate", + "type": "other", + "url": "https://palletsprojects.com/donate" + }, + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://werkzeug.palletsprojects.com/changes/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "Werkzeug", + "purl": "pkg:pypi/werkzeug@3.1.3", + "type": "library", + "version": "3.1.3" + }, + { + "bom-ref": "agentic-lg==0.1.0", + "description": "LangGraph-native agentic workflows with YAML-driven agents", + "externalReferences": [ + { + "comment": "PackageSource: Local", + "type": "distribution", + "url": "file:///D:/source/prompts/agentic-lg/packages/core" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "agentic-lg", + "type": "library", + "version": "0.1.0" + }, + { + "bom-ref": "agentic-v2-eval==0.3.0", + "description": "Evaluation framework for Agentic Workflows v2.", + "externalReferences": [ + { + "comment": "PackageSource: Local", + "type": "distribution", + "url": "file:///C:/Users/tandf/source/prompts/agentic-v2-eval" + } + ], + "name": "agentic-v2-eval", + "type": "library", + "version": "0.3.0" + }, + { + "bom-ref": "agentic-workflows-v2==0.1.0", + "description": "Tier-based multi-model AI workflow orchestration", + "externalReferences": [ + { + "comment": "PackageSource: Local", + "type": "distribution", + "url": "file:///C:/Users/tandf/source/prompts/agentic-workflows-v2" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "agentic-workflows-v2", + "type": "library", + "version": "0.1.0" + }, + { + "bom-ref": "aiofiles==24.1.0", + "description": "File support for asyncio.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/Tinche/aiofiles/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/Tinche/aiofiles#history" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/Tinche/aiofiles" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "aiofiles", + "purl": "pkg:pypi/aiofiles@24.1.0", + "type": "library", + "version": "24.1.0" + }, + { + "bom-ref": "aiohappyeyeballs==2.6.1", + "description": "Happy Eyeballs for asyncio", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://aiohappyeyeballs.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/aio-libs/aiohappyeyeballs/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/aio-libs/aiohappyeyeballs/blob/main/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/aio-libs/aiohappyeyeballs" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "PSF-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "id": "Python-2.0" + } + } + ], + "name": "aiohappyeyeballs", + "purl": "pkg:pypi/aiohappyeyeballs@2.6.1", + "type": "library", + "version": "2.6.1" + }, + { + "bom-ref": "aiohttp==3.12.13", + "description": "Async http client/server framework (asyncio)", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Coverage: codecov", + "type": "other", + "url": "https://codecov.io/github/aio-libs/aiohttp" + }, + { + "comment": "from packaging metadata Project-URL: Docs: RTD", + "type": "other", + "url": "https://docs.aiohttp.org" + }, + { + "comment": "from packaging metadata Project-URL: Docs: Changelog", + "type": "other", + "url": "https://docs.aiohttp.org/en/stable/changes.html" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: repo", + "type": "other", + "url": "https://github.com/aio-libs/aiohttp" + }, + { + "comment": "from packaging metadata Project-URL: CI: GitHub Actions", + "type": "other", + "url": "https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: issues", + "type": "other", + "url": "https://github.com/aio-libs/aiohttp/issues" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/aio-libs/aiohttp" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "aiohttp", + "purl": "pkg:pypi/aiohttp@3.12.13", + "type": "library", + "version": "3.12.13" + }, + { + "bom-ref": "aiosignal==1.3.2", + "description": "aiosignal: a list of registered asynchronous callbacks", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Coverage: codecov", + "type": "other", + "url": "https://codecov.io/github/aio-libs/aiosignal" + }, + { + "comment": "from packaging metadata Project-URL: Docs: RTD", + "type": "other", + "url": "https://docs.aiosignal.org" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: repo", + "type": "other", + "url": "https://github.com/aio-libs/aiosignal" + }, + { + "comment": "from packaging metadata Project-URL: CI: GitHub Actions", + "type": "other", + "url": "https://github.com/aio-libs/aiosignal/actions" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: issues", + "type": "other", + "url": "https://github.com/aio-libs/aiosignal/issues" + }, + { + "comment": "from packaging metadata Project-URL: Chat: Gitter", + "type": "other", + "url": "https://gitter.im/aio-libs/Lobby" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/aio-libs/aiosignal" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "aiosignal", + "purl": "pkg:pypi/aiosignal@1.3.2", + "type": "library", + "version": "1.3.2" + }, + { + "bom-ref": "aiosqlite==0.22.1", + "description": "asyncio bridge to the standard sqlite3 module", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://aiosqlite.omnilib.dev" + }, + { + "comment": "from packaging metadata Project-URL: Github", + "type": "vcs", + "url": "https://github.com/omnilib/aiosqlite" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "aiosqlite", + "purl": "pkg:pypi/aiosqlite@0.22.1", + "type": "library", + "version": "0.22.1" + }, + { + "bom-ref": "alembic==1.17.2", + "description": "A database migration tool for SQLAlchemy.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://alembic.sqlalchemy.org/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/sqlalchemy/alembic/issues/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/sqlalchemy/alembic/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://alembic.sqlalchemy.org/en/latest/changelog.html" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://alembic.sqlalchemy.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "alembic", + "purl": "pkg:pypi/alembic@1.17.2", + "type": "library", + "version": "1.17.2" + }, + { + "bom-ref": "aniso8601==10.0.1", + "description": "A library for parsing ISO 8601 strings.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://aniso8601.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://codeberg.org/nielsenb-jf/aniso8601/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://codeberg.org/nielsenb-jf/aniso8601" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://codeberg.org/nielsenb-jf/aniso8601/src/branch/main/CHANGELOG.rst" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://codeberg.org/nielsenb-jf/aniso8601" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "aniso8601", + "purl": "pkg:pypi/aniso8601@10.0.1", + "type": "library", + "version": "10.0.1" + }, + { + "bom-ref": "annotated-doc==0.0.4", + "description": "Document parameters, class attributes, return types, and variables inline, with Annotated.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://github.com/fastapi/annotated-doc" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/fastapi/annotated-doc/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/fastapi/annotated-doc/release-notes.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/fastapi/annotated-doc" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/fastapi/annotated-doc" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "annotated-doc", + "purl": "pkg:pypi/annotated-doc@0.0.4", + "type": "library", + "version": "0.0.4" + }, + { + "bom-ref": "annotated-types==0.7.0", + "description": "Reusable constraint types to use with typing.Annotated", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/annotated-types/annotated-types" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/annotated-types/annotated-types/releases" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/annotated-types/annotated-types" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "annotated-types", + "purl": "pkg:pypi/annotated-types@0.7.0", + "type": "library", + "version": "0.7.0" + }, + { + "bom-ref": "anthropic==0.79.0", + "description": "The official Python library for the anthropic API", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/anthropics/anthropic-sdk-python" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/anthropics/anthropic-sdk-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "anthropic", + "purl": "pkg:pypi/anthropic@0.79.0", + "type": "library", + "version": "0.79.0" + }, + { + "bom-ref": "anyio==4.11.0", + "description": "High-level concurrency and networking framework on top of asyncio or Trio", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://anyio.readthedocs.io/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Issue tracker", + "type": "issue-tracker", + "url": "https://github.com/agronholm/anyio/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source code", + "type": "other", + "url": "https://github.com/agronholm/anyio" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://anyio.readthedocs.io/en/stable/versionhistory.html" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "anyio", + "purl": "pkg:pypi/anyio@4.11.0", + "type": "library", + "version": "4.11.0" + }, + { + "bom-ref": "argcomplete==3.6.3", + "description": "Bash tab completion for argparse", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://kislyuk.github.io/argcomplete" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/kislyuk/argcomplete/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/kislyuk/argcomplete" + }, + { + "comment": "from packaging metadata Project-URL: Change Log", + "type": "release-notes", + "url": "https://github.com/kislyuk/argcomplete/blob/develop/Changes.rst" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/kislyuk/argcomplete" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "argcomplete", + "purl": "pkg:pypi/argcomplete@3.6.3", + "type": "library", + "version": "3.6.3" + }, + { + "bom-ref": "arrow==1.4.0", + "description": "Better dates & times for Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://arrow.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/arrow-py/arrow/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/arrow-py/arrow" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "arrow", + "purl": "pkg:pypi/arrow@1.4.0", + "type": "library", + "version": "1.4.0" + }, + { + "bom-ref": "asttokens==3.0.1", + "description": "Annotate AST trees with source code positions", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://asttokens.readthedocs.io/en/latest/index.html" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/gristlabs/asttokens/issues" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/gristlabs/asttokens" + } + ], + "name": "asttokens", + "purl": "pkg:pypi/asttokens@3.0.1", + "type": "library", + "version": "3.0.1" + }, + { + "bom-ref": "attrs==25.3.0", + "description": "Classes Without Boilerplate", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://www.attrs.org/" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/hynek" + }, + { + "comment": "from packaging metadata Project-URL: Tidelift", + "type": "other", + "url": "https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://www.attrs.org/en/stable/changelog.html" + }, + { + "comment": "from packaging metadata Project-URL: GitHub", + "type": "vcs", + "url": "https://github.com/python-attrs/attrs" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "attrs", + "purl": "pkg:pypi/attrs@25.3.0", + "type": "library", + "version": "25.3.0" + }, + { + "bom-ref": "azure-core==1.36.0", + "description": "Microsoft Azure Core Library for Python", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/core/azure-core" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "azure-core", + "purl": "pkg:pypi/azure-core@1.36.0", + "type": "library", + "version": "1.36.0" + }, + { + "bom-ref": "azure-identity==1.25.1", + "description": "Microsoft Azure Identity Library for Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/Azure/azure-sdk-for-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "azure-identity", + "purl": "pkg:pypi/azure-identity@1.25.1", + "type": "library", + "version": "1.25.1" + }, + { + "bom-ref": "azure-monitor-opentelemetry-exporter==1.0.0b45", + "description": "Microsoft Azure Monitor Opentelemetry Exporter Client Library for Python", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/monitor/azure-monitor-opentelemetry-exporter" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "azure-monitor-opentelemetry-exporter", + "purl": "pkg:pypi/azure-monitor-opentelemetry-exporter@1.0.0b45", + "type": "library", + "version": "1.0.0b45" + }, + { + "bom-ref": "babel==2.18.0", + "description": "Internationalization utilities", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/python-babel/babel" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://babel.pocoo.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "babel", + "purl": "pkg:pypi/babel@2.18.0", + "type": "library", + "version": "2.18.0" + }, + { + "bom-ref": "backrefs==6.2", + "description": "A wrapper around re and regex that adds additional back references.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/facelessuser/backrefs" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "backrefs", + "purl": "pkg:pypi/backrefs@6.2", + "type": "library", + "version": "6.2" + }, + { + "bom-ref": "bandit==1.9.4", + "description": "Security oriented static analyser for python code.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://bandit.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/PyCQA/bandit/issues" + }, + { + "comment": "from packaging metadata Project-URL: Discord", + "type": "other", + "url": "https://discord.gg/qYxpadCgkx" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/PyCQA/bandit" + }, + { + "comment": "from packaging metadata Project-URL: Release Notes", + "type": "other", + "url": "https://github.com/PyCQA/bandit/releases" + }, + { + "comment": "from packaging metadata Project-URL: Sponsor", + "type": "other", + "url": "https://psfmember.org/civicrm/contribute/transact/?reset=1&id=42" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://bandit.readthedocs.io/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "bandit", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "toml" + } + ], + "purl": "pkg:pypi/bandit@1.9.4", + "type": "library", + "version": "1.9.4" + }, + { + "bom-ref": "beartype==0.22.6", + "description": "Unbearably fast near-real-time pure-Python runtime-static type-checker.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Docs", + "type": "documentation", + "url": "https://beartype.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/beartype/beartype/issues" + }, + { + "comment": "from packaging metadata Project-URL: Forums", + "type": "other", + "url": "https://github.com/beartype/beartype/discussions" + }, + { + "comment": "from packaging metadata Project-URL: Releases", + "type": "other", + "url": "https://github.com/beartype/beartype/releases" + }, + { + "comment": "from packaging metadata Project-URL: GitHub", + "type": "vcs", + "url": "https://github.com/beartype/beartype" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "beartype", + "purl": "pkg:pypi/beartype@0.22.6", + "type": "library", + "version": "0.22.6" + }, + { + "bom-ref": "beautifulsoup4==4.14.3", + "description": "Screen-scraping library", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Download", + "type": "distribution", + "url": "https://www.crummy.com/software/BeautifulSoup/bs4/download/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://www.crummy.com/software/BeautifulSoup/bs4/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "beautifulsoup4", + "purl": "pkg:pypi/beautifulsoup4@4.14.3", + "type": "library", + "version": "4.14.3" + }, + { + "bom-ref": "black==26.3.1", + "description": "The uncompromising code formatter.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://black.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/psf/black/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/psf/black/blob/main/CHANGES.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/psf/black" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "black", + "purl": "pkg:pypi/black@26.3.1", + "type": "library", + "version": "26.3.1" + }, + { + "bom-ref": "blinker==1.9.0", + "description": "Fast, simple object-to-object and broadcast signaling", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Chat", + "type": "chat", + "url": "https://discord.gg/pallets" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://blinker.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pallets-eco/blinker/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "blinker", + "purl": "pkg:pypi/blinker@1.9.0", + "type": "library", + "version": "1.9.0" + }, + { + "bom-ref": "boltons==21.0.0", + "description": "When they're not builtins, they're boltons.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/mahmoud/boltons" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "boltons", + "purl": "pkg:pypi/boltons@21.0.0", + "type": "library", + "version": "21.0.0" + }, + { + "bom-ref": "boolean.py==5.0", + "description": "Define boolean algebras, create and parse boolean expressions and create custom boolean DSL.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/bastikr/boolean.py" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-2-Clause" + } + } + ], + "name": "boolean.py", + "purl": "pkg:pypi/boolean.py@5.0", + "type": "library", + "version": "5.0" + }, + { + "bom-ref": "bracex==2.6", + "description": "Bash style brace expander.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/facelessuser/bracex" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "bracex", + "purl": "pkg:pypi/bracex@2.6", + "type": "library", + "version": "2.6" + }, + { + "bom-ref": "build==1.4.2", + "description": "A simple, correct Python build frontend", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: issues", + "type": "issue-tracker", + "url": "https://github.com/pypa/build/issues" + }, + { + "comment": "from packaging metadata Project-URL: source", + "type": "other", + "url": "https://github.com/pypa/build" + }, + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://build.pypa.io/en/stable/changelog.html" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://build.pypa.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "build", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "virtualenv" + } + ], + "purl": "pkg:pypi/build@1.4.2", + "type": "library", + "version": "1.4.2" + }, + { + "bom-ref": "cachetools==6.2.2", + "description": "Extensible memoizing collections and decorators", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/tkem/cachetools/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "cachetools", + "purl": "pkg:pypi/cachetools@6.2.2", + "type": "library", + "version": "6.2.2" + }, + { + "bom-ref": "certifi==2025.6.15", + "description": "Python package for providing Mozilla's CA Bundle.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/certifi/python-certifi" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/certifi/python-certifi" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MPL-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)" + } + } + ], + "name": "certifi", + "purl": "pkg:pypi/certifi@2025.6.15", + "type": "library", + "version": "2025.6.15" + }, + { + "bom-ref": "cffi==2.0.0", + "description": "Foreign Function Interface for Python calling C code.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://cffi.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/python-cffi/cffi/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/python-cffi/cffi" + }, + { + "comment": "from packaging metadata Project-URL: Downloads", + "type": "other", + "url": "https://github.com/python-cffi/cffi/releases" + }, + { + "comment": "from packaging metadata Project-URL: Contact", + "type": "other", + "url": "https://groups.google.com/forum/#!forum/python-cffi" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://cffi.readthedocs.io/en/latest/whatsnew.html" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "cffi", + "purl": "pkg:pypi/cffi@2.0.0", + "type": "library", + "version": "2.0.0" + }, + { + "bom-ref": "chardet==5.2.0", + "description": "Universal encoding detector for Python 3", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://chardet.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/chardet/chardet/issues" + }, + { + "comment": "from packaging metadata Project-URL: GitHub Project", + "type": "other", + "url": "https://github.com/chardet/chardet" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/chardet/chardet" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)" + } + } + ], + "name": "chardet", + "purl": "pkg:pypi/chardet@5.2.0", + "type": "library", + "version": "5.2.0" + }, + { + "bom-ref": "charset-normalizer==3.4.2", + "description": "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://charset-normalizer.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issue tracker", + "type": "issue-tracker", + "url": "https://github.com/jawah/charset_normalizer/issues" + }, + { + "comment": "from packaging metadata Project-URL: Code", + "type": "other", + "url": "https://github.com/jawah/charset_normalizer" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "charset-normalizer", + "purl": "pkg:pypi/charset-normalizer@3.4.2", + "type": "library", + "version": "3.4.2" + }, + { + "bom-ref": "click==8.1.8", + "description": "Composable command line interface toolkit", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Chat", + "type": "chat", + "url": "https://discord.gg/pallets" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://click.palletsprojects.com/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pallets/click/" + }, + { + "comment": "from packaging metadata Project-URL: Donate", + "type": "other", + "url": "https://palletsprojects.com/donate" + }, + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://click.palletsprojects.com/changes/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "click", + "purl": "pkg:pypi/click@8.1.8", + "type": "library", + "version": "8.1.8" + }, + { + "bom-ref": "click-option-group==0.5.9", + "description": "Option groups missing in Click", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://click-option-group.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/click-contrib/click-option-group/issues" + }, + { + "comment": "from packaging metadata Project-URL: Code", + "type": "other", + "url": "https://github.com/click-contrib/click-option-group" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/click-contrib/click-option-group" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "click-option-group", + "purl": "pkg:pypi/click-option-group@0.5.9", + "type": "library", + "version": "0.5.9" + }, + { + "bom-ref": "colorama==0.4.6", + "description": "Cross-platform colored terminal text.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/tartley/colorama" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "colorama", + "purl": "pkg:pypi/colorama@0.4.6", + "type": "library", + "version": "0.4.6" + }, + { + "bom-ref": "coloredlogs==15.0.1", + "description": "Colored terminal output for Python's logging module", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://coloredlogs.readthedocs.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "coloredlogs", + "purl": "pkg:pypi/coloredlogs@15.0.1", + "type": "library", + "version": "15.0.1" + }, + { + "bom-ref": "colorlog==6.10.1", + "description": "Add colours to the output of Python's logging module.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/borntyping/python-colorlog" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "colorlog", + "purl": "pkg:pypi/colorlog@6.10.1", + "type": "library", + "version": "6.10.1" + }, + { + "bom-ref": "comm==0.2.3", + "description": "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/ipython/comm" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "comm", + "purl": "pkg:pypi/comm@0.2.3", + "type": "library", + "version": "0.2.3" + }, + { + "bom-ref": "contourpy==1.3.3", + "description": "Python library for calculating contours of 2D quadrilateral grids", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://contourpy.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://contourpy.readthedocs.io/en/latest/changelog.html" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/contourpy/contourpy" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/contourpy/contourpy" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "contourpy", + "purl": "pkg:pypi/contourpy@1.3.3", + "type": "library", + "version": "1.3.3" + }, + { + "bom-ref": "coverage==7.13.4", + "description": "Code coverage measurement for Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://coverage.readthedocs.io/en/7.13.4" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/coveragepy/coveragepy/issues" + }, + { + "comment": "from packaging metadata Project-URL: Mastodon", + "type": "other", + "url": "https://hachyderm.io/@coveragepy" + }, + { + "comment": "from packaging metadata Project-URL: Mastodon (nedbat)", + "type": "other", + "url": "https://hachyderm.io/@nedbat" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=pypi" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/coveragepy/coveragepy" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "coverage", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "toml" + } + ], + "purl": "pkg:pypi/coverage@7.13.4", + "type": "library", + "version": "7.13.4" + }, + { + "bom-ref": "cryptography==46.0.3", + "description": "cryptography is a package which provides cryptographic recipes and primitives to Python developers.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://cryptography.io/" + }, + { + "comment": "from packaging metadata Project-URL: issues", + "type": "issue-tracker", + "url": "https://github.com/pyca/cryptography/issues" + }, + { + "comment": "from packaging metadata Project-URL: source", + "type": "other", + "url": "https://github.com/pyca/cryptography/" + }, + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://cryptography.io/en/latest/changelog/" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://github.com/pyca/cryptography" + } + ], + "licenses": [ + { + "acknowledgement": "declared", + "expression": "Apache-2.0 OR BSD-3-Clause" + } + ], + "name": "cryptography", + "purl": "pkg:pypi/cryptography@46.0.3", + "type": "library", + "version": "46.0.3" + }, + { + "bom-ref": "cycler==0.12.1", + "description": "Composable style cycles", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/matplotlib/cycler" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://matplotlib.org/cycler/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "cycler", + "purl": "pkg:pypi/cycler@0.12.1", + "type": "library", + "version": "0.12.1" + }, + { + "bom-ref": "cyclonedx-bom==7.3.0", + "description": "CycloneDX Software Bill of Materials (SBOM) generator for Python projects and environments", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://cyclonedx-bom-tool.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/CycloneDX/cyclonedx-python/issues" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://owasp.org/donate/?reponame=www-project-cyclonedx&title=OWASP+CycloneDX" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/CycloneDX/cyclonedx-python/releases" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/CycloneDX/cyclonedx-python/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/CycloneDX/cyclonedx-python/#readme" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "cyclonedx-bom", + "purl": "pkg:pypi/cyclonedx-bom@7.3.0", + "type": "library", + "version": "7.3.0" + }, + { + "bom-ref": "cyclonedx-python-lib==11.7.0", + "description": "Python library for CycloneDX", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://cyclonedx-python-library.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://owasp.org/donate/?reponame=www-project-cyclonedx&title=OWASP+CycloneDX" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/releases" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/#readme" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "cyclonedx-python-lib", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "validation" + } + ], + "purl": "pkg:pypi/cyclonedx-python-lib@11.7.0", + "type": "library", + "version": "11.7.0" + }, + { + "bom-ref": "cyclopts==4.2.5", + "description": "Intuitive, easy CLIs based on type hints.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/BrianPugh/cyclopts" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/BrianPugh/cyclopts" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "cyclopts", + "purl": "pkg:pypi/cyclopts@4.2.5", + "type": "library", + "version": "4.2.5" + }, + { + "bom-ref": "dataclasses-json==0.6.7", + "description": "Easily serialize dataclasses to and from JSON.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://lidatong.github.io/dataclasses-json/" + }, + { + "comment": "from packaging metadata Project-URL: issues", + "type": "issue-tracker", + "url": "https://github.com/lidatong/dataclasses-json/issues" + }, + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://github.com/lidatong/dataclasses-json/releases" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/lidatong/dataclasses-json" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/lidatong/dataclasses-json" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "dataclasses-json", + "purl": "pkg:pypi/dataclasses-json@0.6.7", + "type": "library", + "version": "0.6.7" + }, + { + "bom-ref": "datasets==4.5.0", + "description": "HuggingFace community-driven open-source library of datasets", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://github.com/huggingface/datasets/tags" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/huggingface/datasets" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "datasets", + "purl": "pkg:pypi/datasets@4.5.0", + "type": "library", + "version": "4.5.0" + }, + { + "bom-ref": "debugpy==1.8.20", + "description": "An implementation of the Debug Adapter Protocol for Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/microsoft/debugpy" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://aka.ms/debugpy" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "debugpy", + "purl": "pkg:pypi/debugpy@1.8.20", + "type": "library", + "version": "1.8.20" + }, + { + "bom-ref": "decorator==5.2.1", + "description": "Decorators for Humans", + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-2-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "decorator", + "purl": "pkg:pypi/decorator@5.2.1", + "type": "library", + "version": "5.2.1" + }, + { + "bom-ref": "defusedxml==0.7.1", + "description": "XML bomb protection for Python stdlib modules", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://pypi.python.org/pypi/defusedxml" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/tiran/defusedxml" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Python-2.0" + } + } + ], + "name": "defusedxml", + "purl": "pkg:pypi/defusedxml@0.7.1", + "type": "library", + "version": "0.7.1" + }, + { + "bom-ref": "deprecation==2.1.0", + "description": "A library to handle automated deprecations", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "http://deprecation.readthedocs.io/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/briancurtin/deprecation/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/briancurtin/deprecation" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://deprecation.readthedocs.io/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "deprecation", + "purl": "pkg:pypi/deprecation@2.1.0", + "type": "library", + "version": "2.1.0" + }, + { + "bom-ref": "dill==0.4.0", + "description": "serialize all of Python", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://pypi.org/project/dill/#files" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "http://dill.rtfd.io" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/uqfoundation/dill/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/uqfoundation/dill" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/uqfoundation/dill" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "dill", + "purl": "pkg:pypi/dill@0.4.0", + "type": "library", + "version": "0.4.0" + }, + { + "bom-ref": "diskcache==5.6.3", + "description": "Disk Cache -- Disk and file backed persistent cache.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "http://www.grantjenks.com/docs/diskcache/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/grantjenks/python-diskcache/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/grantjenks/python-diskcache" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://gum.co/diskcache" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://www.grantjenks.com/docs/diskcache/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "diskcache", + "purl": "pkg:pypi/diskcache@5.6.3", + "type": "library", + "version": "5.6.3" + }, + { + "bom-ref": "distro==1.9.0", + "description": "Distro - an OS platform information API", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/python-distro/distro" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "distro", + "purl": "pkg:pypi/distro@1.9.0", + "type": "library", + "version": "1.9.0" + }, + { + "bom-ref": "dnspython==2.8.0", + "description": "DNS toolkit", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://dnspython.readthedocs.io/en/stable/" + }, + { + "comment": "from packaging metadata Project-URL: issues", + "type": "issue-tracker", + "url": "https://github.com/rthalley/dnspython/issues" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/rthalley/dnspython.git" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://www.dnspython.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "ISC" + } + } + ], + "name": "dnspython", + "purl": "pkg:pypi/dnspython@2.8.0", + "type": "library", + "version": "2.8.0" + }, + { + "bom-ref": "docstring_parser==0.17.0", + "description": "Parse Python docstrings in reST, Google and Numpydoc format", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://github.com/rr-/docstring_parser/blob/master/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/rr-/docstring_parser" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://github.com/rr-/docstring_parser" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "docstring_parser", + "purl": "pkg:pypi/docstring-parser@0.17.0", + "type": "library", + "version": "0.17.0" + }, + { + "bom-ref": "docutils==0.22.3", + "description": "Docutils -- Python Documentation Utilities", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Download", + "type": "distribution", + "url": "https://pypi.org/project/docutils/" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docutils.sourceforge.io/docs/" + }, + { + "comment": "from packaging metadata Project-URL: Issue tracker", + "type": "issue-tracker", + "url": "https://sourceforge.net/p/docutils/bugs/" + }, + { + "comment": "from packaging metadata Project-URL: Code", + "type": "other", + "url": "https://sourceforge.net/p/docutils/code/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://docutils.sourceforge.io/HISTORY.html" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://docutils.sourceforge.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: GNU General Public License (GPL)" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: Public Domain" + } + } + ], + "name": "docutils", + "purl": "pkg:pypi/docutils@0.22.3", + "type": "library", + "version": "0.22.3" + }, + { + "bom-ref": "edge-tts==7.2.7", + "description": "Microsoft Edge's TTS", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/rany2/edge-tts/issues" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/rany2/edge-tts" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "LGPL-3.0-only" + } + } + ], + "name": "edge-tts", + "purl": "pkg:pypi/edge-tts@7.2.7", + "type": "library", + "version": "7.2.7" + }, + { + "bom-ref": "email-validator==2.3.0", + "description": "A robust email address syntax and deliverability validation library.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/JoshData/python-email-validator" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Unlicense" + } + } + ], + "name": "email-validator", + "purl": "pkg:pypi/email-validator@2.3.0", + "type": "library", + "version": "2.3.0" + }, + { + "bom-ref": "et_xmlfile==2.0.0", + "description": "An implementation of lxml.xmlfile for the standard library", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://openpyxl.pages.heptapod.net/et_xmlfile/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://foss.heptapod.net/openpyxl/et_xmfile/-/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://foss.heptapod.net/openpyxl/et_xmlfile" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://foss.heptapod.net/openpyxl/et_xmlfile" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "et_xmlfile", + "purl": "pkg:pypi/et-xmlfile@2.0.0", + "type": "library", + "version": "2.0.0" + }, + { + "bom-ref": "exceptiongroup==1.2.2", + "description": "Backport of PEP 654 (exception groups)", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/agronholm/exceptiongroup/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source code", + "type": "other", + "url": "https://github.com/agronholm/exceptiongroup" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "exceptiongroup", + "purl": "pkg:pypi/exceptiongroup@1.2.2", + "type": "library", + "version": "1.2.2" + }, + { + "bom-ref": "executing==2.2.1", + "description": "Get the currently executing AST node of a frame, and other information", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/alexmojaki/executing" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "executing", + "purl": "pkg:pypi/executing@2.2.1", + "type": "library", + "version": "2.2.1" + }, + { + "bom-ref": "executionkit==0.1.0", + "description": "Composable LLM reasoning patterns with budget-aware execution", + "externalReferences": [ + { + "comment": "PackageSource: Local", + "type": "distribution", + "url": "file:///C:/Users/tandf/source/executionkit" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/tafreeman/executionkit/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/tafreeman/executionkit/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/tafreeman/executionkit" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "executionkit", + "type": "library", + "version": "0.1.0" + }, + { + "bom-ref": "face==26.0.0", + "description": "A command-line application framework (and CLI parser). Friendly for users, full-featured for developers.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://python-face.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/mahmoud/face" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/mahmoud/face" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "face", + "purl": "pkg:pypi/face@26.0.0", + "type": "library", + "version": "26.0.0" + }, + { + "bom-ref": "faiss-cpu==1.13.2", + "description": "A library for efficient similarity search and clustering of dense vectors.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/kyamagu/faiss-wheels" + } + ], + "licenses": [ + { + "acknowledgement": "declared", + "expression": "MIT AND BSD-3-Clause" + } + ], + "name": "faiss-cpu", + "purl": "pkg:pypi/faiss-cpu@1.13.2", + "type": "library", + "version": "1.13.2" + }, + { + "bom-ref": "fastapi==0.123.4", + "description": "FastAPI framework, high performance, easy to learn, fast to code, ready for production", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://fastapi.tiangolo.com/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/fastapi/fastapi/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://fastapi.tiangolo.com/release-notes/" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/fastapi/fastapi" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/fastapi/fastapi" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "fastapi", + "purl": "pkg:pypi/fastapi@0.123.4", + "type": "library", + "version": "0.123.4" + }, + { + "bom-ref": "fastmcp==2.13.1", + "description": "The fast, Pythonic way to build MCP servers and clients.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://gofastmcp.com" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/jlowin/fastmcp" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://gofastmcp.com" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "fastmcp", + "purl": "pkg:pypi/fastmcp@2.13.1", + "type": "library", + "version": "2.13.1" + }, + { + "bom-ref": "filelock==3.20.0", + "description": "A platform independent file lock.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://py-filelock.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/tox-dev/py-filelock/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/tox-dev/py-filelock" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/tox-dev/py-filelock" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Unlicense" + } + } + ], + "name": "filelock", + "purl": "pkg:pypi/filelock@3.20.0", + "type": "library", + "version": "3.20.0" + }, + { + "bom-ref": "filetype==1.2.0", + "description": "Infer file type and MIME type of any file/buffer. No external dependencies.", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://github.com/h2non/filetype.py/tarball/master" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/h2non/filetype.py" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "filetype", + "purl": "pkg:pypi/filetype@1.2.0", + "type": "library", + "version": "1.2.0" + }, + { + "bom-ref": "flake8==7.3.0", + "description": "the modular source code checker: pep8 pyflakes and co", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/pycqa/flake8" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "flake8", + "purl": "pkg:pypi/flake8@7.3.0", + "type": "library", + "version": "7.3.0" + }, + { + "bom-ref": "flask-cors==6.0.1", + "description": "A Flask extension simplifying CORS support", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://corydolphin.github.io/flask-cors/" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/corydolphin/flask-cors" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://corydolphin.github.io/flask-cors/" + } + ], + "name": "flask-cors", + "purl": "pkg:pypi/flask-cors@6.0.1", + "type": "library", + "version": "6.0.1" + }, + { + "bom-ref": "flask-restx==1.3.2", + "description": "Fully featured framework for fast, easy and documented API development with Flask", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/python-restx/flask-restx" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "flask-restx", + "purl": "pkg:pypi/flask-restx@1.3.2", + "type": "library", + "version": "1.3.2" + }, + { + "bom-ref": "flatbuffers==25.9.23", + "description": "The FlatBuffers serialization format for Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://google.github.io/flatbuffers/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/google/flatbuffers" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://google.github.io/flatbuffers/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "flatbuffers", + "purl": "pkg:pypi/flatbuffers@25.9.23", + "type": "library", + "version": "25.9.23" + }, + { + "bom-ref": "fonttools==4.60.1", + "description": "Tools to manipulate font files", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://github.com/fonttools/fonttools" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "fonttools", + "purl": "pkg:pypi/fonttools@4.60.1", + "type": "library", + "version": "4.60.1" + }, + { + "bom-ref": "fqdn==1.5.1", + "description": "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/ypcrts/fqdn" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)" + } + } + ], + "name": "fqdn", + "purl": "pkg:pypi/fqdn@1.5.1", + "type": "library", + "version": "1.5.1" + }, + { + "bom-ref": "frozenlist==1.7.0", + "description": "A list-like structure which implements collections.abc.MutableSequence", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Coverage: codecov", + "type": "other", + "url": "https://codecov.io/github/aio-libs/frozenlist" + }, + { + "comment": "from packaging metadata Project-URL: Docs: RTD", + "type": "other", + "url": "https://frozenlist.aio-libs.org" + }, + { + "comment": "from packaging metadata Project-URL: Code of Conduct", + "type": "other", + "url": "https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: repo", + "type": "other", + "url": "https://github.com/aio-libs/frozenlist" + }, + { + "comment": "from packaging metadata Project-URL: CI: Github Actions", + "type": "other", + "url": "https://github.com/aio-libs/frozenlist/actions" + }, + { + "comment": "from packaging metadata Project-URL: Docs: Changelog", + "type": "other", + "url": "https://github.com/aio-libs/frozenlist/blob/master/CHANGES.rst#changelog" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: issues", + "type": "other", + "url": "https://github.com/aio-libs/frozenlist/issues" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/aio-libs/frozenlist" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "frozenlist", + "purl": "pkg:pypi/frozenlist@1.7.0", + "type": "library", + "version": "1.7.0" + }, + { + "bom-ref": "fsspec==2025.10.0", + "description": "File-system specification", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://filesystem-spec.readthedocs.io/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://filesystem-spec.readthedocs.io/en/latest/changelog.html" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/fsspec/filesystem_spec" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "fsspec", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "http" + } + ], + "purl": "pkg:pypi/fsspec@2025.10.0", + "type": "library", + "version": "2025.10.0" + }, + { + "bom-ref": "ghp-import==2.1.0", + "description": "Copy your docs directly to the gh-pages branch.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/c-w/ghp-import" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "ghp-import", + "purl": "pkg:pypi/ghp-import@2.1.0", + "type": "library", + "version": "2.1.0" + }, + { + "bom-ref": "git-filter-repo==2.47.0", + "description": "Quickly rewrite git repository history", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/newren/git-filter-repo/issues/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/newren/git-filter-repo" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/newren/git-filter-repo" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "git-filter-repo", + "purl": "pkg:pypi/git-filter-repo@2.47.0", + "type": "library", + "version": "2.47.0" + }, + { + "bom-ref": "gitdb==4.0.12", + "description": "Git Object Database", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/gitpython-developers/gitdb" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "gitdb", + "purl": "pkg:pypi/gitdb@4.0.12", + "type": "library", + "version": "4.0.12" + }, + { + "bom-ref": "glom==25.12.0", + "description": "A declarative object transformer and formatter, for conglomerating nested data.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://glom.readthedocs.io/en/latest/" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/mahmoud/glom" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "glom", + "purl": "pkg:pypi/glom@25.12.0", + "type": "library", + "version": "25.12.0" + }, + { + "bom-ref": "google-ai-generativelanguage==0.11.0", + "description": "Google Ai Generativelanguage API client library", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-ai-generativelanguage" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "google-ai-generativelanguage", + "purl": "pkg:pypi/google-ai-generativelanguage@0.11.0", + "type": "library", + "version": "0.11.0" + }, + { + "bom-ref": "google-api-core==2.29.0", + "description": "Google API client core library", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://googleapis.dev/python/google-api-core/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/googleapis/python-api-core" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "google-api-core", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "grpc" + } + ], + "purl": "pkg:pypi/google-api-core@2.29.0", + "type": "library", + "version": "2.29.0" + }, + { + "bom-ref": "google-api-python-client==2.189.0", + "description": "Google API Client Library for Python", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/googleapis/google-api-python-client/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "google-api-python-client", + "purl": "pkg:pypi/google-api-python-client@2.189.0", + "type": "library", + "version": "2.189.0" + }, + { + "bom-ref": "google-auth==2.48.0", + "description": "Google Authentication Library", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/googleapis/google-auth-library-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "google-auth", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "aiohttp" + }, + { + "name": "cdx:python:package:required-extra", + "value": "requests" + } + ], + "purl": "pkg:pypi/google-auth@2.48.0", + "type": "library", + "version": "2.48.0" + }, + { + "bom-ref": "google-auth-httplib2==0.3.0", + "description": "Google Authentication Library: httplib2 transport", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/GoogleCloudPlatform/google-auth-library-python-httplib2" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "google-auth-httplib2", + "purl": "pkg:pypi/google-auth-httplib2@0.3.0", + "type": "library", + "version": "0.3.0" + }, + { + "bom-ref": "google-genai==1.63.0", + "description": "GenAI Python SDK", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/googleapis/python-genai" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "google-genai", + "purl": "pkg:pypi/google-genai@1.63.0", + "type": "library", + "version": "1.63.0" + }, + { + "bom-ref": "google-generativeai==0.8.6", + "description": "Google Generative AI High level API client library and tools.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/google/generative-ai-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "google-generativeai", + "purl": "pkg:pypi/google-generativeai@0.8.6", + "type": "library", + "version": "0.8.6" + }, + { + "bom-ref": "google_search_results==2.4.1", + "description": "Scrape and search localized results from Google, Bing, Baidu, Yahoo, Yandex, Ebay, Homedepot, youtube at scale using SerpApi.com", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/serpapi/google-search-results-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "google_search_results", + "purl": "pkg:pypi/google-search-results@2.4.1", + "type": "library", + "version": "2.4.1" + }, + { + "bom-ref": "googleapis-common-protos==1.72.0", + "description": "Common protobufs used in Google APIs", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/googleapis/google-cloud-python/tree/main/packages/googleapis-common-protos" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "googleapis-common-protos", + "purl": "pkg:pypi/googleapis-common-protos@1.72.0", + "type": "library", + "version": "1.72.0" + }, + { + "bom-ref": "greenlet==3.2.4", + "description": "Lightweight in-process concurrent programming", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://greenlet.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/python-greenlet/greenlet/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/python-greenlet/greenlet/" + }, + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://greenlet.readthedocs.io/en/latest/changes.html" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://greenlet.readthedocs.io/" + } + ], + "licenses": [ + { + "acknowledgement": "declared", + "expression": "MIT AND Python-2.0" + } + ], + "name": "greenlet", + "purl": "pkg:pypi/greenlet@3.2.4", + "type": "library", + "version": "3.2.4" + }, + { + "bom-ref": "griffelib==2.0.2", + "description": "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API.", + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "ISC" + } + } + ], + "name": "griffelib", + "purl": "pkg:pypi/griffelib@2.0.2", + "type": "library", + "version": "2.0.2" + }, + { + "bom-ref": "grpcio==1.76.0", + "description": "HTTP/2-based RPC framework", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://grpc.github.io/grpc/python" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/grpc/grpc/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/grpc/grpc" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://grpc.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "grpcio", + "purl": "pkg:pypi/grpcio@1.76.0", + "type": "library", + "version": "1.76.0" + }, + { + "bom-ref": "grpcio-status==1.71.2", + "description": "Status proto mapping for gRPC", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://grpc.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "grpcio-status", + "purl": "pkg:pypi/grpcio-status@1.71.2", + "type": "library", + "version": "1.71.2" + }, + { + "bom-ref": "h11==0.16.0", + "description": "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/python-hyper/h11" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "h11", + "purl": "pkg:pypi/h11@0.16.0", + "type": "library", + "version": "0.16.0" + }, + { + "bom-ref": "hatchling==1.29.0", + "description": "Modern, extensible Python build backend", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/pypa/hatch/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pypa/hatch/tree/master/backend" + }, + { + "comment": "from packaging metadata Project-URL: Sponsor", + "type": "other", + "url": "https://github.com/sponsors/ofek" + }, + { + "comment": "from packaging metadata Project-URL: History", + "type": "other", + "url": "https://hatch.pypa.io/dev/history/hatchling/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://hatch.pypa.io/latest/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "hatchling", + "purl": "pkg:pypi/hatchling@1.29.0", + "type": "library", + "version": "1.29.0" + }, + { + "bom-ref": "httpcore==1.0.9", + "description": "A minimal low-level HTTP client.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://www.encode.io/httpcore" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/encode/httpcore" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://www.encode.io/httpcore/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "httpcore", + "purl": "pkg:pypi/httpcore@1.0.9", + "type": "library", + "version": "1.0.9" + }, + { + "bom-ref": "httplib2==0.31.2", + "description": "A comprehensive HTTP client library.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/httplib2/httplib2" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "httplib2", + "purl": "pkg:pypi/httplib2@0.31.2", + "type": "library", + "version": "0.31.2" + }, + { + "bom-ref": "httptools==0.7.1", + "description": "A collection of framework independent HTTP protocol utils.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/MagicStack/httptools" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "httptools", + "purl": "pkg:pypi/httptools@0.7.1", + "type": "library", + "version": "0.7.1" + }, + { + "bom-ref": "httpx==0.28.1", + "description": "The next generation HTTP client.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://www.python-httpx.org" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/encode/httpx" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/encode/httpx/blob/master/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/encode/httpx" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "httpx", + "purl": "pkg:pypi/httpx@0.28.1", + "type": "library", + "version": "0.28.1" + }, + { + "bom-ref": "httpx-sse==0.4.3", + "description": "Consume Server-Sent Event (SSE) messages with HTTPX.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/florimondmanca/httpx-sse" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "httpx-sse", + "purl": "pkg:pypi/httpx-sse@0.4.3", + "type": "library", + "version": "0.4.3" + }, + { + "bom-ref": "huggingface-hub==0.36.0", + "description": "Client library to download and publish models, datasets and other repos on the huggingface.co hub", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/huggingface/huggingface_hub" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "huggingface-hub", + "purl": "pkg:pypi/huggingface-hub@0.36.0", + "type": "library", + "version": "0.36.0" + }, + { + "bom-ref": "humanfriendly==10.0", + "description": "Human friendly output for text interfaces using Python", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://humanfriendly.readthedocs.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "humanfriendly", + "purl": "pkg:pypi/humanfriendly@10.0", + "type": "library", + "version": "10.0" + }, + { + "bom-ref": "idna==3.10", + "description": "Internationalized Domain Names in Applications (IDNA)", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issue tracker", + "type": "issue-tracker", + "url": "https://github.com/kjd/idna/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/kjd/idna" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/kjd/idna/blob/master/HISTORY.rst" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "idna", + "purl": "pkg:pypi/idna@3.10", + "type": "library", + "version": "3.10" + }, + { + "bom-ref": "importlib_metadata==8.7.0", + "description": "Read metadata from Python packages", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/python/importlib_metadata" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "importlib_metadata", + "purl": "pkg:pypi/importlib-metadata@8.7.0", + "type": "library", + "version": "8.7.0" + }, + { + "bom-ref": "importlib_resources==6.5.2", + "description": "Read resources from Python packages", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/python/importlib_resources" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "importlib_resources", + "purl": "pkg:pypi/importlib-resources@6.5.2", + "type": "library", + "version": "6.5.2" + }, + { + "bom-ref": "iniconfig==2.3.0", + "description": "brain-dead simple config-ini parsing", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/pytest-dev/iniconfig" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "iniconfig", + "purl": "pkg:pypi/iniconfig@2.3.0", + "type": "library", + "version": "2.3.0" + }, + { + "bom-ref": "ipykernel==7.2.0", + "description": "IPython Kernel for Jupyter", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://ipykernel.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/ipython/ipykernel/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/ipython/ipykernel" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://ipython.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "ipykernel", + "purl": "pkg:pypi/ipykernel@7.2.0", + "type": "library", + "version": "7.2.0" + }, + { + "bom-ref": "ipython==9.10.0", + "description": "IPython: Productive Interactive Computing", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://ipython.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/ipython/ipython/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/ipython/ipython" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://jupyter.org/about#donate" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://ipython.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "ipython", + "purl": "pkg:pypi/ipython@9.10.0", + "type": "library", + "version": "9.10.0" + }, + { + "bom-ref": "ipython_pygments_lexers==1.1.1", + "description": "Defines a variety of Pygments lexers for highlighting IPython code.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/ipython/ipython-pygments-lexers" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "ipython_pygments_lexers", + "purl": "pkg:pypi/ipython-pygments-lexers@1.1.1", + "type": "library", + "version": "1.1.1" + }, + { + "bom-ref": "isodate==0.7.2", + "description": "An ISO 8601 date/time/duration parser and formatter", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/gweis/isodate/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "isodate", + "purl": "pkg:pypi/isodate@0.7.2", + "type": "library", + "version": "0.7.2" + }, + { + "bom-ref": "isoduration==20.11.0", + "description": "Operations with ISO 8601 durations", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Reports", + "type": "issue-tracker", + "url": "https://github.com/bolsote/isoduration/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/bolsote/isoduration/blob/master/CHANGELOG" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/bolsote/isoduration" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/bolsote/isoduration" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "ISC" + } + } + ], + "name": "isoduration", + "purl": "pkg:pypi/isoduration@20.11.0", + "type": "library", + "version": "20.11.0" + }, + { + "bom-ref": "itsdangerous==2.2.0", + "description": "Safely pass data to untrusted environments and back.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Chat", + "type": "chat", + "url": "https://discord.gg/pallets" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://itsdangerous.palletsprojects.com/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pallets/itsdangerous/" + }, + { + "comment": "from packaging metadata Project-URL: Donate", + "type": "other", + "url": "https://palletsprojects.com/donate" + }, + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://itsdangerous.palletsprojects.com/changes/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "itsdangerous", + "purl": "pkg:pypi/itsdangerous@2.2.0", + "type": "library", + "version": "2.2.0" + }, + { + "bom-ref": "jaraco.classes==3.4.0", + "description": "Utility functions for Python class constructs", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/jaraco/jaraco.classes" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "jaraco.classes", + "purl": "pkg:pypi/jaraco.classes@3.4.0", + "type": "library", + "version": "3.4.0" + }, + { + "bom-ref": "jaraco.context==6.0.1", + "description": "Useful decorators and context managers", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/jaraco/jaraco.context" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "jaraco.context", + "purl": "pkg:pypi/jaraco.context@6.0.1", + "type": "library", + "version": "6.0.1" + }, + { + "bom-ref": "jaraco.functools==4.3.0", + "description": "Functools like those found in stdlib", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/jaraco/jaraco.functools" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "jaraco.functools", + "purl": "pkg:pypi/jaraco.functools@4.3.0", + "type": "library", + "version": "4.3.0" + }, + { + "bom-ref": "jedi==0.19.2", + "description": "An autocompletion tool for Python that can be used for text editors.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://jedi.readthedocs.io/en/latest/" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/davidhalter/jedi" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "jedi", + "purl": "pkg:pypi/jedi@0.19.2", + "type": "library", + "version": "0.19.2" + }, + { + "bom-ref": "jiter==0.12.0", + "description": "Fast iterable JSON parser.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/pydantic/jiter/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "jiter", + "purl": "pkg:pypi/jiter@0.12.0", + "type": "library", + "version": "0.12.0" + }, + { + "bom-ref": "jmespath==1.1.0", + "description": "JSON Matching Expressions", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/jmespath/jmespath.py" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "jmespath", + "purl": "pkg:pypi/jmespath@1.1.0", + "type": "library", + "version": "1.1.0" + }, + { + "bom-ref": "joblib==1.5.3", + "description": "Lightweight pipelining with Python functions", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/joblib/joblib" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://joblib.readthedocs.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "joblib", + "purl": "pkg:pypi/joblib@1.5.3", + "type": "library", + "version": "1.5.3" + }, + { + "bom-ref": "jsbeautifier==1.15.4", + "description": "JavaScript unobfuscator and beautifier.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://beautifier.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "jsbeautifier", + "purl": "pkg:pypi/jsbeautifier@1.15.4", + "type": "library", + "version": "1.15.4" + }, + { + "bom-ref": "jsonpatch==1.33", + "description": "Apply JSON-Patches (RFC 6902) ", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://python-json-patch.readthedocs.org/" + }, + { + "comment": "from packaging metadata Project-URL: Test Coverage", + "type": "other", + "url": "https://coveralls.io/r/stefankoegl/python-json-patch" + }, + { + "comment": "from packaging metadata Project-URL: Website", + "type": "other", + "url": "https://github.com/stefankoegl/python-json-patch" + }, + { + "comment": "from packaging metadata Project-URL: PyPI", + "type": "other", + "url": "https://pypi.org/pypi/jsonpatch" + }, + { + "comment": "from packaging metadata Project-URL: Tests", + "type": "other", + "url": "https://travis-ci.org/stefankoegl/python-json-patch" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/stefankoegl/python-json-patch.git" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/stefankoegl/python-json-patch" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "jsonpatch", + "purl": "pkg:pypi/jsonpatch@1.33", + "type": "library", + "version": "1.33" + }, + { + "bom-ref": "jsonpointer==3.0.0", + "description": "Identify specific nodes in a JSON document (RFC 6901) ", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/stefankoegl/python-json-pointer" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "jsonpointer", + "purl": "pkg:pypi/jsonpointer@3.0.0", + "type": "library", + "version": "3.0.0" + }, + { + "bom-ref": "jsonschema==4.25.1", + "description": "An implementation of JSON Schema validation for Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://python-jsonschema.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/python-jsonschema/jsonschema/issues/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/python-jsonschema/jsonschema" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/Julian" + }, + { + "comment": "from packaging metadata Project-URL: Tidelift", + "type": "other", + "url": "https://tidelift.com/subscription/pkg/pypi-jsonschema?utm_source=pypi-jsonschema&utm_medium=referral&utm_campaign=pypi-link" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/python-jsonschema/jsonschema" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "jsonschema", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "format-nongpl" + } + ], + "purl": "pkg:pypi/jsonschema@4.25.1", + "type": "library", + "version": "4.25.1" + }, + { + "bom-ref": "jsonschema-path==0.3.4", + "description": "JSONSchema Spec with object-oriented paths", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/p1c2u/jsonschema-path" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "jsonschema-path", + "purl": "pkg:pypi/jsonschema-path@0.3.4", + "type": "library", + "version": "0.3.4" + }, + { + "bom-ref": "jsonschema-specifications==2025.9.1", + "description": "The JSON Schema meta-schemas and vocabularies, exposed as a Registry", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://jsonschema-specifications.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/python-jsonschema/jsonschema-specifications/issues/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/python-jsonschema/jsonschema-specifications" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/Julian" + }, + { + "comment": "from packaging metadata Project-URL: Tidelift", + "type": "other", + "url": "https://tidelift.com/subscription/pkg/pypi-jsonschema-specifications?utm_source=pypi-jsonschema-specifications&utm_medium=referral&utm_campaign=pypi-link" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/python-jsonschema/jsonschema-specifications" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "jsonschema-specifications", + "purl": "pkg:pypi/jsonschema-specifications@2025.9.1", + "type": "library", + "version": "2025.9.1" + }, + { + "bom-ref": "jupyter_client==8.8.0", + "description": "Jupyter protocol implementation and client libraries", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://jupyter-client.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/jupyter/jupyter_client" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://jupyter.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "jupyter_client", + "purl": "pkg:pypi/jupyter-client@8.8.0", + "type": "library", + "version": "8.8.0" + }, + { + "bom-ref": "jupyter_core==5.9.1", + "description": "Jupyter core package. A base package on which Jupyter projects rely.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://jupyter-core.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/jupyter/jupyter_core/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/jupyter/jupyter_core" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://jupyter.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "jupyter_core", + "purl": "pkg:pypi/jupyter-core@5.9.1", + "type": "library", + "version": "5.9.1" + }, + { + "bom-ref": "keyring==24.3.1", + "description": "Store and access your passwords safely.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/jaraco/keyring" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "keyring", + "purl": "pkg:pypi/keyring@24.3.1", + "type": "library", + "version": "24.3.1" + }, + { + "bom-ref": "kiwisolver==1.4.9", + "description": "A fast implementation of the Cassowary constraint solver", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://kiwisolver.readthedocs.io/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://github.com/nucleic/kiwi/blob/main/releasenotes.rst" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/nucleic/kiwi" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://github.com/nucleic/kiwi" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "kiwisolver", + "purl": "pkg:pypi/kiwisolver@1.4.9", + "type": "library", + "version": "1.4.9" + }, + { + "bom-ref": "lance-namespace==0.5.2", + "description": "Lance Namespace interface and plugin registry", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://lance.org/format/namespace/" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/lance-format/lance-namespace" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "lance-namespace", + "purl": "pkg:pypi/lance-namespace@0.5.2", + "type": "library", + "version": "0.5.2" + }, + { + "bom-ref": "lance-namespace-urllib3-client==0.5.2", + "description": "Lance Namespace Specification", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/lance-format/lance-namespace" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "lance-namespace-urllib3-client", + "purl": "pkg:pypi/lance-namespace-urllib3-client@0.5.2", + "type": "library", + "version": "0.5.2" + }, + { + "bom-ref": "lancedb==0.29.2", + "description": "lancedb", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/lancedb/lancedb" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "lancedb", + "purl": "pkg:pypi/lancedb@0.29.2", + "type": "library", + "version": "0.29.2" + }, + { + "bom-ref": "langchain==0.3.28", + "description": "Building applications with LLMs through composability", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Release Notes", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain%3D%3D0%22&expanded=true" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/tree/master/libs/langchain" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/langchain-ai/langchain" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langchain", + "purl": "pkg:pypi/langchain@0.3.28", + "type": "library", + "version": "0.3.28" + }, + { + "bom-ref": "langchain-anthropic==0.2.4", + "description": "An integration package connecting AnthropicMessages and LangChain", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Release Notes", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-anthropic%3D%3D0%22&expanded=true" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/tree/master/libs/partners/anthropic" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/langchain-ai/langchain" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/langchain-ai/langchain" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langchain-anthropic", + "purl": "pkg:pypi/langchain-anthropic@0.2.4", + "type": "library", + "version": "0.2.4" + }, + { + "bom-ref": "langchain-classic==1.0.1", + "description": "Building applications with LLMs through composability", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://reference.langchain.com/python/langchain_classic/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/tree/master/libs/langchain" + }, + { + "comment": "from packaging metadata Project-URL: Slack", + "type": "other", + "url": "https://www.langchain.com/join-community" + }, + { + "comment": "from packaging metadata Project-URL: Reddit", + "type": "other", + "url": "https://www.reddit.com/r/LangChain/" + }, + { + "comment": "from packaging metadata Project-URL: Twitter", + "type": "other", + "url": "https://x.com/LangChainAI" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-classic%3D%3D1%22" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://docs.langchain.com/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langchain-classic", + "purl": "pkg:pypi/langchain-classic@1.0.1", + "type": "library", + "version": "1.0.1" + }, + { + "bom-ref": "langchain-community==0.4.1", + "description": "Community contributed LangChain integrations.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/langchain-ai/langchain-community/tree/main/libs/community" + }, + { + "comment": "from packaging metadata Project-URL: Release Notes", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-community%3D%3D0%22&expanded=true" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/langchain-ai/langchain-community" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langchain-community", + "purl": "pkg:pypi/langchain-community@0.4.1", + "type": "library", + "version": "0.4.1" + }, + { + "bom-ref": "langchain-core==0.3.84", + "description": "Building applications with LLMs through composability", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Release Notes", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-core%3D%3D0%22&expanded=true" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/tree/master/libs/core" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/langchain-ai/langchain" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langchain-core", + "purl": "pkg:pypi/langchain-core@0.3.84", + "type": "library", + "version": "0.3.84" + }, + { + "bom-ref": "langchain-google-genai==2.1.12", + "description": "An integration package connecting Google's genai package and LangChain", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Release Notes", + "type": "other", + "url": "https://github.com/langchain-ai/langchain-google/releases" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/langchain-ai/langchain-google/tree/main/libs/genai" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/langchain-ai/langchain-google" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langchain-google-genai", + "purl": "pkg:pypi/langchain-google-genai@2.1.12", + "type": "library", + "version": "2.1.12" + }, + { + "bom-ref": "langchain-ollama==0.2.3", + "description": "An integration package connecting Ollama and LangChain", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Release Notes", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-ollama%3D%3D0%22&expanded=true" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/tree/master/libs/partners/ollama" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/langchain-ai/langchain" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/langchain-ai/langchain" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langchain-ollama", + "purl": "pkg:pypi/langchain-ollama@0.2.3", + "type": "library", + "version": "0.2.3" + }, + { + "bom-ref": "langchain-openai==0.2.14", + "description": "An integration package connecting OpenAI and LangChain", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Release Notes", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-openai%3D%3D0%22&expanded=true" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/tree/master/libs/partners/openai" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/langchain-ai/langchain" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/langchain-ai/langchain" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langchain-openai", + "purl": "pkg:pypi/langchain-openai@0.2.14", + "type": "library", + "version": "0.2.14" + }, + { + "bom-ref": "langchain-text-splitters==0.3.11", + "description": "LangChain text splitting utilities", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Release Notes", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-text-splitters%3D%3D0%22&expanded=true" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/langchain-ai/langchain/tree/master/libs/text-splitters" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/langchain-ai/langchain" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langchain-text-splitters", + "purl": "pkg:pypi/langchain-text-splitters@0.3.11", + "type": "library", + "version": "0.3.11" + }, + { + "bom-ref": "langgraph==0.2.76", + "description": "Building stateful, multi-actor applications with LLMs", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://www.github.com/langchain-ai/langgraph" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://www.github.com/langchain-ai/langgraph" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langgraph", + "purl": "pkg:pypi/langgraph@0.2.76", + "type": "library", + "version": "0.2.76" + }, + { + "bom-ref": "langgraph-checkpoint==2.1.2", + "description": "Library with base interfaces for LangGraph checkpoint savers.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://www.github.com/langchain-ai/langgraph" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langgraph-checkpoint", + "purl": "pkg:pypi/langgraph-checkpoint@2.1.2", + "type": "library", + "version": "2.1.2" + }, + { + "bom-ref": "langgraph-checkpoint-sqlite==2.0.11", + "description": "Library with a SQLite implementation of LangGraph checkpoint saver.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://www.github.com/langchain-ai/langgraph" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langgraph-checkpoint-sqlite", + "purl": "pkg:pypi/langgraph-checkpoint-sqlite@2.0.11", + "type": "library", + "version": "2.0.11" + }, + { + "bom-ref": "langgraph-prebuilt==1.0.7", + "description": "Library with high-level APIs for creating and executing LangGraph agents and tools.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/langchain-ai/langgraph/tree/main/libs/prebuilt" + }, + { + "comment": "from packaging metadata Project-URL: Slack", + "type": "other", + "url": "https://www.langchain.com/join-community" + }, + { + "comment": "from packaging metadata Project-URL: Reddit", + "type": "other", + "url": "https://www.reddit.com/r/LangChain/" + }, + { + "comment": "from packaging metadata Project-URL: Twitter", + "type": "other", + "url": "https://x.com/LangChain" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langgraph-prebuilt", + "purl": "pkg:pypi/langgraph-prebuilt@1.0.7", + "type": "library", + "version": "1.0.7" + }, + { + "bom-ref": "langgraph-sdk==0.1.74", + "description": "SDK for interacting with LangGraph API", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://www.github.com/langchain-ai/langgraph" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langgraph-sdk", + "purl": "pkg:pypi/langgraph-sdk@0.1.74", + "type": "library", + "version": "0.1.74" + }, + { + "bom-ref": "langsmith==0.3.45", + "description": "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.smith.langchain.com/" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/langchain-ai/langsmith-sdk" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://smith.langchain.com/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "langsmith", + "purl": "pkg:pypi/langsmith@0.3.45", + "type": "library", + "version": "0.3.45" + }, + { + "bom-ref": "lark==1.3.1", + "description": "a modern parsing library", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Download", + "type": "distribution", + "url": "https://github.com/lark-parser/lark/tarball/master" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/lark-parser/lark" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "lark", + "purl": "pkg:pypi/lark@1.3.1", + "type": "library", + "version": "1.3.1" + }, + { + "bom-ref": "librt==0.8.0", + "description": "Mypyc runtime library", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/mypyc/mypyc/issues" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/mypyc/librt" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "librt", + "purl": "pkg:pypi/librt@0.8.0", + "type": "library", + "version": "0.8.0" + }, + { + "bom-ref": "license-expression==30.4.4", + "description": "license-expression is a comprehensive utility library to parse, compare, simplify and normalize license expressions (such as SPDX license expressions) using boolean logic.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/aboutcode-org/license-expression" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "license-expression", + "purl": "pkg:pypi/license-expression@30.4.4", + "type": "library", + "version": "30.4.4" + }, + { + "bom-ref": "lightning-utilities==0.15.2", + "description": "Lightning toolbox for across the our ecosystem.", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://github.com/Lightning-AI/utilities" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://dev-toolbox.rtfd.io/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/Lightning-AI/utilities/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/Lightning-AI/utilities" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Lightning-AI/utilities" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "lightning-utilities", + "purl": "pkg:pypi/lightning-utilities@0.15.2", + "type": "library", + "version": "0.15.2" + }, + { + "bom-ref": "llm-maestro==0.1.0", + "description": "Multi-provider LLM probe, discovery, and unified runner", + "externalReferences": [ + { + "comment": "PackageSource: Local", + "type": "distribution", + "url": "file:///C:/Users/tandf/source/repos/llm-maestro" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "llm-maestro", + "type": "library", + "version": "0.1.0" + }, + { + "bom-ref": "lxml==6.0.2", + "description": "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://bugs.launchpad.net/lxml" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/lxml/lxml" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://lxml.de/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "lxml", + "purl": "pkg:pypi/lxml@6.0.2", + "type": "library", + "version": "6.0.2" + }, + { + "bom-ref": "markdown-it-py==3.0.0", + "description": "Python port of markdown-it. Markdown parsing, done right!", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://markdown-it-py.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/executablebooks/markdown-it-py" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "markdown-it-py", + "purl": "pkg:pypi/markdown-it-py@3.0.0", + "type": "library", + "version": "3.0.0" + }, + { + "bom-ref": "marshmallow==3.26.1", + "description": "A lightweight library for converting complex datatypes to and from native Python datatypes.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/marshmallow-code/marshmallow/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/marshmallow-code/marshmallow" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://opencollective.com/marshmallow" + }, + { + "comment": "from packaging metadata Project-URL: Tidelift", + "type": "other", + "url": "https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=pypi" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://marshmallow.readthedocs.io/en/latest/changelog.html" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "marshmallow", + "purl": "pkg:pypi/marshmallow@3.26.1", + "type": "library", + "version": "3.26.1" + }, + { + "bom-ref": "matplotlib==3.10.7", + "description": "Python plotting package", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Download", + "type": "distribution", + "url": "https://matplotlib.org/stable/install/index.html" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://matplotlib.org" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/matplotlib/matplotlib/issues" + }, + { + "comment": "from packaging metadata Project-URL: Forum", + "type": "other", + "url": "https://discourse.matplotlib.org/" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/matplotlib/matplotlib" + }, + { + "comment": "from packaging metadata Project-URL: Donate", + "type": "other", + "url": "https://numfocus.org/donate-to-matplotlib" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://matplotlib.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Python-2.0" + } + } + ], + "name": "matplotlib", + "purl": "pkg:pypi/matplotlib@3.10.7", + "type": "library", + "version": "3.10.7" + }, + { + "bom-ref": "matplotlib-inline==0.2.1", + "description": "Inline Matplotlib backend for Jupyter", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/ipython/matplotlib-inline" + } + ], + "name": "matplotlib-inline", + "purl": "pkg:pypi/matplotlib-inline@0.2.1", + "type": "library", + "version": "0.2.1" + }, + { + "bom-ref": "mccabe==0.7.0", + "description": "McCabe checker, plugin for flake8", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/pycqa/mccabe" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mccabe", + "purl": "pkg:pypi/mccabe@0.7.0", + "type": "library", + "version": "0.7.0" + }, + { + "bom-ref": "mcp==1.23.3", + "description": "Model Context Protocol SDK", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/modelcontextprotocol/python-sdk/issues" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/modelcontextprotocol/python-sdk" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://modelcontextprotocol.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mcp", + "purl": "pkg:pypi/mcp@1.23.3", + "type": "library", + "version": "1.23.3" + }, + { + "bom-ref": "mdurl==0.1.2", + "description": "Markdown URL utilities", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/executablebooks/mdurl" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mdurl", + "purl": "pkg:pypi/mdurl@0.1.2", + "type": "library", + "version": "0.1.2" + }, + { + "bom-ref": "mergedeep==1.3.4", + "description": "A deep merge function for \ud83d\udc0d.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/clarketm/mergedeep" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mergedeep", + "purl": "pkg:pypi/mergedeep@1.3.4", + "type": "library", + "version": "1.3.4" + }, + { + "bom-ref": "mkdocs==1.6.1", + "description": "Project documentation with Markdown.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://www.mkdocs.org/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/mkdocs/mkdocs/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/mkdocs/mkdocs" + }, + { + "comment": "from packaging metadata Project-URL: History", + "type": "other", + "url": "https://www.mkdocs.org/about/release-notes/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-2-Clause" + } + } + ], + "name": "mkdocs", + "purl": "pkg:pypi/mkdocs@1.6.1", + "type": "library", + "version": "1.6.1" + }, + { + "bom-ref": "mkdocs-autorefs==1.4.4", + "description": "Automatically link across pages in MkDocs.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://mkdocstrings.github.io/autorefs" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/mkdocstrings/autorefs/issues" + }, + { + "comment": "from packaging metadata Project-URL: Discussions", + "type": "other", + "url": "https://github.com/mkdocstrings/autorefs/discussions" + }, + { + "comment": "from packaging metadata Project-URL: Gitter", + "type": "other", + "url": "https://gitter.im/mkdocstrings/autorefs" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://mkdocstrings.github.io/autorefs/changelog" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/mkdocstrings/autorefs" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://mkdocstrings.github.io/autorefs" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "ISC" + } + } + ], + "name": "mkdocs-autorefs", + "purl": "pkg:pypi/mkdocs-autorefs@1.4.4", + "type": "library", + "version": "1.4.4" + }, + { + "bom-ref": "mkdocs-get-deps==0.2.2", + "description": "An extra command for MkDocs that infers required PyPI packages from `plugins` in mkdocs.yml", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/mkdocs/get-deps/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/mkdocs/get-deps" + }, + { + "comment": "from packaging metadata Project-URL: History", + "type": "other", + "url": "https://github.com/mkdocs/get-deps/releases" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mkdocs-get-deps", + "purl": "pkg:pypi/mkdocs-get-deps@0.2.2", + "type": "library", + "version": "0.2.2" + }, + { + "bom-ref": "mkdocs-git-revision-date-localized-plugin==1.5.1", + "description": "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/timvink/mkdocs-git-revision-date-localized-plugin" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mkdocs-git-revision-date-localized-plugin", + "purl": "pkg:pypi/mkdocs-git-revision-date-localized-plugin@1.5.1", + "type": "library", + "version": "1.5.1" + }, + { + "bom-ref": "mkdocs-material==9.7.6", + "description": "Documentation that simply works", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://squidfunk.github.io/mkdocs-material/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/squidfunk/mkdocs-material/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/squidfunk/mkdocs-material" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://squidfunk.github.io/mkdocs-material/changelog/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mkdocs-material", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "imaging" + } + ], + "purl": "pkg:pypi/mkdocs-material@9.7.6", + "type": "library", + "version": "9.7.6" + }, + { + "bom-ref": "mkdocs-material-extensions==1.3.1", + "description": "Extension pack for Python Markdown and MkDocs Material.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/facelessuser/mkdocs-material-extensions" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mkdocs-material-extensions", + "purl": "pkg:pypi/mkdocs-material-extensions@1.3.1", + "type": "library", + "version": "1.3.1" + }, + { + "bom-ref": "mkdocs-mermaid2-plugin==1.2.3", + "description": "A MkDocs plugin for including mermaid graphs in markdown sources", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/fralau/mkdocs-mermaid2-plugin" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mkdocs-mermaid2-plugin", + "purl": "pkg:pypi/mkdocs-mermaid2-plugin@1.2.3", + "type": "library", + "version": "1.2.3" + }, + { + "bom-ref": "mkdocstrings==1.0.3", + "description": "Automatic documentation from sources, for MkDocs.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://mkdocstrings.github.io" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/mkdocstrings/mkdocstrings/issues" + }, + { + "comment": "from packaging metadata Project-URL: Discussions", + "type": "other", + "url": "https://github.com/mkdocstrings/mkdocstrings/discussions" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/pawamoy" + }, + { + "comment": "from packaging metadata Project-URL: Gitter", + "type": "other", + "url": "https://gitter.im/mkdocstrings/community" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://mkdocstrings.github.io/changelog" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/mkdocstrings/mkdocstrings" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://mkdocstrings.github.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "ISC" + } + } + ], + "name": "mkdocstrings", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "python" + } + ], + "purl": "pkg:pypi/mkdocstrings@1.0.3", + "type": "library", + "version": "1.0.3" + }, + { + "bom-ref": "mkdocstrings-python==2.0.3", + "description": "A Python handler for mkdocstrings.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://mkdocstrings.github.io/python" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/mkdocstrings/python/issues" + }, + { + "comment": "from packaging metadata Project-URL: Discussions", + "type": "other", + "url": "https://github.com/mkdocstrings/python/discussions" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/pawamoy" + }, + { + "comment": "from packaging metadata Project-URL: Gitter", + "type": "other", + "url": "https://gitter.im/mkdocstrings/python" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://mkdocstrings.github.io/python/changelog" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/mkdocstrings/python" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://mkdocstrings.github.io/python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "ISC" + } + } + ], + "name": "mkdocstrings-python", + "purl": "pkg:pypi/mkdocstrings-python@2.0.3", + "type": "library", + "version": "2.0.3" + }, + { + "bom-ref": "ml_dtypes==0.5.4", + "description": "ml_dtypes is a stand-alone implementation of several NumPy dtype extensions used in machine learning.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/jax-ml/ml_dtypes" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://github.com/jax-ml/ml_dtypes" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "ml_dtypes", + "purl": "pkg:pypi/ml-dtypes@0.5.4", + "type": "library", + "version": "0.5.4" + }, + { + "bom-ref": "more-itertools==10.8.0", + "description": "More routines for operating on iterables, beyond itertools", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://more-itertools.readthedocs.io/en/stable/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/more-itertools/more-itertools" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "more-itertools", + "purl": "pkg:pypi/more-itertools@10.8.0", + "type": "library", + "version": "10.8.0" + }, + { + "bom-ref": "mpmath==1.3.0", + "description": "Python library for arbitrary-precision floating-point arithmetic", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "http://mpmath.org/doc/current/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/fredrik-johansson/mpmath/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/fredrik-johansson/mpmath" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://mpmath.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "mpmath", + "purl": "pkg:pypi/mpmath@1.3.0", + "type": "library", + "version": "1.3.0" + }, + { + "bom-ref": "msal==1.34.0", + "description": "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://msal-python.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Feature/Bug Tracker", + "type": "other", + "url": "https://github.com/AzureAD/microsoft-authentication-library-for-python/issues" + }, + { + "comment": "from packaging metadata Project-URL: Questions", + "type": "other", + "url": "https://stackoverflow.com/questions/tagged/azure-ad-msal+python" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/AzureAD/microsoft-authentication-library-for-python/releases" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/AzureAD/microsoft-authentication-library-for-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "msal", + "purl": "pkg:pypi/msal@1.34.0", + "type": "library", + "version": "1.34.0" + }, + { + "bom-ref": "msal-extensions==1.3.1", + "description": "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/AzureAD/microsoft-authentication-extensions-for-python/releases" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "msal-extensions", + "purl": "pkg:pypi/msal-extensions@1.3.1", + "type": "library", + "version": "1.3.1" + }, + { + "bom-ref": "msrest==0.7.1", + "description": "AutoRest swagger generator Python client runtime.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Azure/msrest-for-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "msrest", + "purl": "pkg:pypi/msrest@0.7.1", + "type": "library", + "version": "0.7.1" + }, + { + "bom-ref": "multidict==6.6.2", + "description": "multidict implementation", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Coverage: codecov", + "type": "other", + "url": "https://codecov.io/github/aio-libs/multidict" + }, + { + "comment": "from packaging metadata Project-URL: Code of Conduct", + "type": "other", + "url": "https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: repo", + "type": "other", + "url": "https://github.com/aio-libs/multidict" + }, + { + "comment": "from packaging metadata Project-URL: CI: GitHub", + "type": "other", + "url": "https://github.com/aio-libs/multidict/actions" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: issues", + "type": "other", + "url": "https://github.com/aio-libs/multidict/issues" + }, + { + "comment": "from packaging metadata Project-URL: Docs: RTD", + "type": "other", + "url": "https://multidict.aio-libs.org" + }, + { + "comment": "from packaging metadata Project-URL: Docs: Changelog", + "type": "other", + "url": "https://multidict.aio-libs.org/en/latest/changes/" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/aio-libs/multidict" + } + ], + "name": "multidict", + "purl": "pkg:pypi/multidict@6.6.2", + "type": "library", + "version": "6.6.2" + }, + { + "bom-ref": "multiprocess==0.70.18", + "description": "better multiprocessing and multithreading in Python", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://pypi.org/project/multiprocess/#files" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "http://multiprocess.rtfd.io" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/uqfoundation/multiprocess/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/uqfoundation/multiprocess" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/uqfoundation/multiprocess" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "multiprocess", + "purl": "pkg:pypi/multiprocess@0.70.18", + "type": "library", + "version": "0.70.18" + }, + { + "bom-ref": "mypy==1.19.1", + "description": "Optional static typing for Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://mypy.readthedocs.io/en/stable/index.html" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/python/mypy/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/python/mypy/blob/master/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/python/mypy" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://www.mypy-lang.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mypy", + "purl": "pkg:pypi/mypy@1.19.1", + "type": "library", + "version": "1.19.1" + }, + { + "bom-ref": "mypy_extensions==1.1.0", + "description": "Type system extensions for programs checked with the mypy type checker.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/python/mypy_extensions" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "mypy_extensions", + "purl": "pkg:pypi/mypy-extensions@1.1.0", + "type": "library", + "version": "1.1.0" + }, + { + "bom-ref": "nest-asyncio==1.6.0", + "description": "Patch asyncio to allow nested event loops", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/erdewit/nest_asyncio" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "nest-asyncio", + "purl": "pkg:pypi/nest-asyncio@1.6.0", + "type": "library", + "version": "1.6.0" + }, + { + "bom-ref": "networkx==3.6", + "description": "Python package for creating and manipulating graphs and networks", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://networkx.org/documentation/stable/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/networkx/networkx/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/networkx/networkx" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://networkx.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "networkx", + "purl": "pkg:pypi/networkx@3.6", + "type": "library", + "version": "3.6" + }, + { + "bom-ref": "nltk==3.9.2", + "description": "Natural Language Toolkit", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://www.nltk.org/" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/nltk/nltk/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/nltk/nltk" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://www.nltk.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "nltk", + "purl": "pkg:pypi/nltk@3.9.2", + "type": "library", + "version": "3.9.2" + }, + { + "bom-ref": "numpy==2.3.3", + "description": "Fundamental package for array computing in Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: download", + "type": "distribution", + "url": "https://pypi.org/project/numpy/#files" + }, + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://numpy.org/doc/" + }, + { + "comment": "from packaging metadata Project-URL: tracker", + "type": "issue-tracker", + "url": "https://github.com/numpy/numpy/issues" + }, + { + "comment": "from packaging metadata Project-URL: source", + "type": "other", + "url": "https://github.com/numpy/numpy" + }, + { + "comment": "from packaging metadata Project-URL: release notes", + "type": "other", + "url": "https://numpy.org/doc/stable/release" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://numpy.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "numpy", + "purl": "pkg:pypi/numpy@2.3.3", + "type": "library", + "version": "2.3.3" + }, + { + "bom-ref": "oauthlib==3.3.1", + "description": "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/oauthlib/oauthlib" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "oauthlib", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "signedtoken" + } + ], + "purl": "pkg:pypi/oauthlib@3.3.1", + "type": "library", + "version": "3.3.1" + }, + { + "bom-ref": "olive-ai==0.10.1", + "description": "Olive: Simplify ML Model Finetuning, Conversion, Quantization, and Optimization for CPUs, GPUs and NPUs.", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://github.com/microsoft/Olive/tags" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://microsoft.github.io/Olive/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "olive-ai", + "purl": "pkg:pypi/olive-ai@0.10.1", + "type": "library", + "version": "0.10.1" + }, + { + "bom-ref": "ollama==0.6.1", + "description": "The official Python client for Ollama.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: issues", + "type": "issue-tracker", + "url": "https://github.com/ollama/ollama-python/issues" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/ollama/ollama-python" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://ollama.com" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "ollama", + "purl": "pkg:pypi/ollama@0.6.1", + "type": "library", + "version": "0.6.1" + }, + { + "bom-ref": "onnx==1.20.0", + "description": "Open Neural Network Exchange", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/onnx/onnx" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://onnx.ai/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "onnx", + "purl": "pkg:pypi/onnx@1.20.0", + "type": "library", + "version": "1.20.0" + }, + { + "bom-ref": "onnx-ir==0.1.12", + "description": "Efficient in-memory representation for ONNX", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/onnx/ir-py/issues" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/onnx/ir-py" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://onnx.ai/ir-py" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "onnx-ir", + "purl": "pkg:pypi/onnx-ir@0.1.12", + "type": "library", + "version": "0.1.12" + }, + { + "bom-ref": "onnxruntime==1.23.2", + "description": "ONNX Runtime is a runtime accelerator for Machine Learning models", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://github.com/microsoft/onnxruntime/tags" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://onnxruntime.ai" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "onnxruntime", + "purl": "pkg:pypi/onnxruntime@1.23.2", + "type": "library", + "version": "1.23.2" + }, + { + "bom-ref": "onnxruntime-directml==1.23.0", + "description": "ONNX Runtime is a runtime accelerator for Machine Learning models", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://github.com/microsoft/onnxruntime/tags" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://onnxruntime.ai" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "onnxruntime-directml", + "purl": "pkg:pypi/onnxruntime-directml@1.23.0", + "type": "library", + "version": "1.23.0" + }, + { + "bom-ref": "onnxruntime-genai==0.11.4", + "description": "ONNX Runtime GenAI", + "name": "onnxruntime-genai", + "purl": "pkg:pypi/onnxruntime-genai@0.11.4", + "type": "library", + "version": "0.11.4" + }, + { + "bom-ref": "onnxruntime-genai-cuda==0.12.0", + "description": "ONNX Runtime GenAI", + "name": "onnxruntime-genai-cuda", + "purl": "pkg:pypi/onnxruntime-genai-cuda@0.12.0", + "type": "library", + "version": "0.12.0" + }, + { + "bom-ref": "onnxruntime-genai-directml==0.10.0", + "description": "ONNX Runtime GenAI", + "name": "onnxruntime-genai-directml", + "purl": "pkg:pypi/onnxruntime-genai-directml@0.10.0", + "type": "library", + "version": "0.10.0" + }, + { + "bom-ref": "onnxruntime-gpu==1.24.1", + "description": "ONNX Runtime is a runtime accelerator for Machine Learning models", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://github.com/microsoft/onnxruntime/tags" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://onnxruntime.ai" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "onnxruntime-gpu", + "purl": "pkg:pypi/onnxruntime-gpu@1.24.1", + "type": "library", + "version": "1.24.1" + }, + { + "bom-ref": "onnxscript==0.5.6", + "description": "Naturally author ONNX functions and models using a subset of Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/microsoft/onnxscript" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://microsoft.github.io/onnxscript/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "onnxscript", + "purl": "pkg:pypi/onnxscript@0.5.6", + "type": "library", + "version": "0.5.6" + }, + { + "bom-ref": "openai==1.109.1", + "description": "The official Python library for the openai API", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/openai/openai-python" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/openai/openai-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "openai", + "purl": "pkg:pypi/openai@1.109.1", + "type": "library", + "version": "1.109.1" + }, + { + "bom-ref": "openapi-pydantic==0.5.1", + "description": "Pydantic OpenAPI schema implementation", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://github.com/mike-oakley/openapi-pydantic/releases" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/mike-oakley/openapi-pydantic" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/mike-oakley/openapi-pydantic" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "openapi-pydantic", + "purl": "pkg:pypi/openapi-pydantic@0.5.1", + "type": "library", + "version": "0.5.1" + }, + { + "bom-ref": "openpyxl==3.1.5", + "description": "A Python library to read/write Excel 2010 xlsx/xlsm files", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://openpyxl.readthedocs.io/en/stable/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://foss.heptapod.net/openpyxl/openpyxl/-/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://foss.heptapod.net/openpyxl/openpyxl" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://openpyxl.readthedocs.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "openpyxl", + "purl": "pkg:pypi/openpyxl@3.1.5", + "type": "library", + "version": "3.1.5" + }, + { + "bom-ref": "opentelemetry-api==1.37.0", + "description": "OpenTelemetry Python API", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-api" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-api", + "purl": "pkg:pypi/opentelemetry-api@1.37.0", + "type": "library", + "version": "1.37.0" + }, + { + "bom-ref": "opentelemetry-exporter-otlp-proto-common==1.37.0", + "description": "OpenTelemetry Protobuf encoding", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-common" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-exporter-otlp-proto-common", + "purl": "pkg:pypi/opentelemetry-exporter-otlp-proto-common@1.37.0", + "type": "library", + "version": "1.37.0" + }, + { + "bom-ref": "opentelemetry-exporter-otlp-proto-http==1.37.0", + "description": "OpenTelemetry Collector Protobuf over HTTP Exporter", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-http" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-exporter-otlp-proto-http", + "purl": "pkg:pypi/opentelemetry-exporter-otlp-proto-http@1.37.0", + "type": "library", + "version": "1.37.0" + }, + { + "bom-ref": "opentelemetry-instrumentation==0.58b0", + "description": "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python-contrib" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/opentelemetry-instrumentation" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-instrumentation", + "purl": "pkg:pypi/opentelemetry-instrumentation@0.58b0", + "type": "library", + "version": "0.58b0" + }, + { + "bom-ref": "opentelemetry-instrumentation-requests==0.58b0", + "description": "OpenTelemetry requests instrumentation", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python-contrib" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-requests" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-instrumentation-requests", + "purl": "pkg:pypi/opentelemetry-instrumentation-requests@0.58b0", + "type": "library", + "version": "0.58b0" + }, + { + "bom-ref": "opentelemetry-instrumentation-threading==0.58b0", + "description": "Thread context propagation support for OpenTelemetry", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python-contrib" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-threading" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-instrumentation-threading", + "purl": "pkg:pypi/opentelemetry-instrumentation-threading@0.58b0", + "type": "library", + "version": "0.58b0" + }, + { + "bom-ref": "opentelemetry-proto==1.37.0", + "description": "OpenTelemetry Python Proto", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-proto" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-proto", + "purl": "pkg:pypi/opentelemetry-proto@1.37.0", + "type": "library", + "version": "1.37.0" + }, + { + "bom-ref": "opentelemetry-sdk==1.37.0", + "description": "OpenTelemetry Python SDK", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-sdk" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-sdk", + "purl": "pkg:pypi/opentelemetry-sdk@1.37.0", + "type": "library", + "version": "1.37.0" + }, + { + "bom-ref": "opentelemetry-semantic-conventions==0.58b0", + "description": "OpenTelemetry Semantic Conventions", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-semantic-conventions" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-semantic-conventions", + "purl": "pkg:pypi/opentelemetry-semantic-conventions@0.58b0", + "type": "library", + "version": "0.58b0" + }, + { + "bom-ref": "opentelemetry-util-http==0.58b0", + "description": "Web util for OpenTelemetry", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/open-telemetry/opentelemetry-python-contrib" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/util/opentelemetry-util-http" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "opentelemetry-util-http", + "purl": "pkg:pypi/opentelemetry-util-http@0.58b0", + "type": "library", + "version": "0.58b0" + }, + { + "bom-ref": "optimum==2.0.0", + "description": "Optimum Library is an extension of the Hugging Face Transformers library, providing a framework to integrate third-party libraries from Hardware Partners and interface with their specific functionality.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/huggingface/optimum" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "optimum", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "openvino" + } + ], + "purl": "pkg:pypi/optimum@2.0.0", + "type": "library", + "version": "2.0.0" + }, + { + "bom-ref": "optuna==4.6.0", + "description": "A hyperparameter optimization framework", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://optuna.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: bugtracker", + "type": "issue-tracker", + "url": "https://github.com/optuna/optuna/issues" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/optuna/optuna" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://optuna.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "optuna", + "purl": "pkg:pypi/optuna@4.6.0", + "type": "library", + "version": "4.6.0" + }, + { + "bom-ref": "orjson==3.11.6", + "description": "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://github.com/ijl/orjson" + }, + { + "comment": "from packaging metadata Project-URL: source", + "type": "other", + "url": "https://github.com/ijl/orjson" + }, + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://github.com/ijl/orjson/blob/master/CHANGELOG.md" + } + ], + "licenses": [ + { + "acknowledgement": "declared", + "expression": "MPL-2.0 AND (Apache-2.0 OR MIT)" + } + ], + "name": "orjson", + "purl": "pkg:pypi/orjson@3.11.6", + "type": "library", + "version": "3.11.6" + }, + { + "bom-ref": "ormsgpack==1.12.2", + "description": "Fast, correct Python msgpack library supporting dataclasses, datetimes, and numpy", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/ormsgpack/ormsgpack" + } + ], + "licenses": [ + { + "acknowledgement": "declared", + "expression": "Apache-2.0 OR MIT" + } + ], + "name": "ormsgpack", + "purl": "pkg:pypi/ormsgpack@1.12.2", + "type": "library", + "version": "1.12.2" + }, + { + "bom-ref": "packageurl-python==0.17.6", + "description": "A purl aka. Package URL parser and builder", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/package-url/packageurl-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "packageurl-python", + "purl": "pkg:pypi/packageurl-python@0.17.6", + "type": "library", + "version": "0.17.6" + }, + { + "bom-ref": "packaging==25.0", + "description": "Core utilities for Python packages", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://packaging.pypa.io/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pypa/packaging" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "packaging", + "purl": "pkg:pypi/packaging@25.0", + "type": "library", + "version": "25.0" + }, + { + "bom-ref": "paginate==0.5.7", + "description": "Divides large result sets into pages for easier browsing", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Signum/paginate" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "paginate", + "purl": "pkg:pypi/paginate@0.5.7", + "type": "library", + "version": "0.5.7" + }, + { + "bom-ref": "pandas==2.3.2", + "description": "Powerful data structures for data analysis, time series, and statistics", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://pandas.pydata.org/docs/" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/pandas-dev/pandas" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://pandas.pydata.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "pandas", + "purl": "pkg:pypi/pandas@2.3.2", + "type": "library", + "version": "2.3.2" + }, + { + "bom-ref": "parso==0.8.6", + "description": "A Python Parser", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/davidhalter/parso" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "parso", + "purl": "pkg:pypi/parso@0.8.6", + "type": "library", + "version": "0.8.6" + }, + { + "bom-ref": "pathable==0.4.4", + "description": "Object-oriented paths", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/p1c2u/pathable" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/p1c2u/pathable" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "pathable", + "purl": "pkg:pypi/pathable@0.4.4", + "type": "library", + "version": "0.4.4" + }, + { + "bom-ref": "pathspec==1.0.4", + "description": "Utility library for gitignore style pattern matching of file paths.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://python-path-specification.readthedocs.io/en/latest/index.html" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/cpburnz/python-pathspec/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/cpburnz/python-pathspec" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)" + } + } + ], + "name": "pathspec", + "purl": "pkg:pypi/pathspec@1.0.4", + "type": "library", + "version": "1.0.4" + }, + { + "bom-ref": "pathvalidate==3.3.1", + "description": "pathvalidate is a Python library to sanitize/validate a string such as filenames/file-paths/etc.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pathvalidate.rtfd.io/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/thombashi/pathvalidate/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/thombashi/pathvalidate" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/thombashi/pathvalidate/blob/master/CHANGELOG.md" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/thombashi/pathvalidate" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pathvalidate", + "purl": "pkg:pypi/pathvalidate@3.3.1", + "type": "library", + "version": "3.3.1" + }, + { + "bom-ref": "pdf2image==1.17.0", + "description": "A wrapper around the pdftoppm and pdftocairo command line tools to convert PDF to a PIL Image list.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Belval/pdf2image" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pdf2image", + "purl": "pkg:pypi/pdf2image@1.17.0", + "type": "library", + "version": "1.17.0" + }, + { + "bom-ref": "peewee==3.19.0", + "description": "a little orm", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.peewee-orm.com/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/coleifer/peewee/blob/master/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/coleifer/peewee" + } + ], + "name": "peewee", + "purl": "pkg:pypi/peewee@3.19.0", + "type": "library", + "version": "3.19.0" + }, + { + "bom-ref": "pillow==11.0.0", + "description": "Python Imaging Library (Fork)", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pillow.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Mastodon", + "type": "other", + "url": "https://fosstodon.org/@pillow" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/python-pillow/Pillow" + }, + { + "comment": "from packaging metadata Project-URL: Release notes", + "type": "other", + "url": "https://pillow.readthedocs.io/en/stable/releasenotes/index.html" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=pypi" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://python-pillow.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT-CMU" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: CMU License (MIT-CMU)" + } + } + ], + "name": "pillow", + "purl": "pkg:pypi/pillow@11.0.0", + "type": "library", + "version": "11.0.0" + }, + { + "bom-ref": "pip==26.0.1", + "description": "The PyPA recommended tool for installing Python packages.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pip.pypa.io" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pypa/pip" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://pip.pypa.io/en/stable/news/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://pip.pypa.io/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pip", + "purl": "pkg:pypi/pip@26.0.1", + "type": "library", + "version": "26.0.1" + }, + { + "bom-ref": "pip==26.1", + "description": "The PyPA recommended tool for installing Python packages.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pip.pypa.io" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pypa/pip" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://pip.pypa.io/en/stable/news/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://pip.pypa.io/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pip", + "purl": "pkg:pypi/pip@26.1", + "type": "library", + "version": "26.1" + }, + { + "bom-ref": "pip-requirements-parser==32.0.1", + "description": "pip requirements parser - a mostly correct pip requirements parsing library because it uses pip's own code.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/nexB/pip-requirements-parser" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pip-requirements-parser", + "purl": "pkg:pypi/pip-requirements-parser@32.0.1", + "type": "library", + "version": "32.0.1" + }, + { + "bom-ref": "platformdirs==4.5.0", + "description": "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://platformdirs.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/tox-dev/platformdirs/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/tox-dev/platformdirs" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/tox-dev/platformdirs/releases" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/tox-dev/platformdirs" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "platformdirs", + "purl": "pkg:pypi/platformdirs@4.5.0", + "type": "library", + "version": "4.5.0" + }, + { + "bom-ref": "pluggy==1.6.0", + "description": "plugin and hook calling mechanisms for python", + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pluggy", + "purl": "pkg:pypi/pluggy@1.6.0", + "type": "library", + "version": "1.6.0" + }, + { + "bom-ref": "prompt_toolkit==3.0.52", + "description": "Library for building powerful interactive command lines in Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://python-prompt-toolkit.readthedocs.io/en/stable/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/prompt-toolkit/python-prompt-toolkit" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "prompt_toolkit", + "purl": "pkg:pypi/prompt-toolkit@3.0.52", + "type": "library", + "version": "3.0.52" + }, + { + "bom-ref": "promptflow==1.18.1", + "description": "Prompt flow Python SDK - build high-quality LLM apps", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Reports", + "type": "issue-tracker", + "url": "https://github.com/microsoft/promptflow/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/microsoft/promptflow" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/microsoft/promptflow" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "promptflow", + "purl": "pkg:pypi/promptflow@1.18.1", + "type": "library", + "version": "1.18.1" + }, + { + "bom-ref": "promptflow-core==1.18.1", + "description": "Prompt flow core", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Reports", + "type": "issue-tracker", + "url": "https://github.com/microsoft/promptflow/issues" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/microsoft/promptflow" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://microsoft.github.io/promptflow/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "promptflow-core", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "azureml-serving" + }, + { + "name": "cdx:python:package:required-extra", + "value": "executor-service" + } + ], + "purl": "pkg:pypi/promptflow-core@1.18.1", + "type": "library", + "version": "1.18.1" + }, + { + "bom-ref": "promptflow-devkit==1.18.1", + "description": "Prompt flow devkit", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Reports", + "type": "issue-tracker", + "url": "https://github.com/microsoft/promptflow/issues" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/microsoft/promptflow" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://microsoft.github.io/promptflow/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "promptflow-devkit", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "all" + }, + { + "name": "cdx:python:package:required-extra", + "value": "executable" + } + ], + "purl": "pkg:pypi/promptflow-devkit@1.18.1", + "type": "library", + "version": "1.18.1" + }, + { + "bom-ref": "promptflow-tools==1.6.1", + "description": "Prompt flow built-in tools", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Reports", + "type": "issue-tracker", + "url": "https://github.com/microsoft/promptflow/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/microsoft/promptflow" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/microsoft/promptflow" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "promptflow-tools", + "purl": "pkg:pypi/promptflow-tools@1.6.1", + "type": "library", + "version": "1.6.1" + }, + { + "bom-ref": "promptflow-tracing==1.18.1", + "description": "Prompt flow tracing", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Reports", + "type": "issue-tracker", + "url": "https://github.com/microsoft/promptflow/issues" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/microsoft/promptflow" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://microsoft.github.io/promptflow/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "promptflow-tracing", + "purl": "pkg:pypi/promptflow-tracing@1.18.1", + "type": "library", + "version": "1.18.1" + }, + { + "bom-ref": "prompts-tools==0.1.0", + "description": "Shared utilities for Agentic Workflows", + "externalReferences": [ + { + "comment": "PackageSource: Local", + "type": "distribution", + "url": "file:///C:/Users/tandf/source/prompts" + } + ], + "name": "prompts-tools", + "type": "library", + "version": "0.1.0" + }, + { + "bom-ref": "propcache==0.3.2", + "description": "Accelerated property cache", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Coverage: codecov", + "type": "other", + "url": "https://codecov.io/github/aio-libs/propcache" + }, + { + "comment": "from packaging metadata Project-URL: Code of Conduct", + "type": "other", + "url": "https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: repo", + "type": "other", + "url": "https://github.com/aio-libs/propcache" + }, + { + "comment": "from packaging metadata Project-URL: CI: GitHub Workflows", + "type": "other", + "url": "https://github.com/aio-libs/propcache/actions?query=branch:master" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: issues", + "type": "other", + "url": "https://github.com/aio-libs/propcache/issues" + }, + { + "comment": "from packaging metadata Project-URL: Docs: RTD", + "type": "other", + "url": "https://propcache.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Docs: Changelog", + "type": "other", + "url": "https://propcache.readthedocs.io/en/latest/changes/" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/aio-libs/propcache" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "propcache", + "purl": "pkg:pypi/propcache@0.3.2", + "type": "library", + "version": "0.3.2" + }, + { + "bom-ref": "proto-plus==1.27.1", + "description": "Beautiful, Pythonic protocol buffers", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://googleapis.dev/python/proto-plus/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/googleapis/proto-plus-python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "proto-plus", + "purl": "pkg:pypi/proto-plus@1.27.1", + "type": "library", + "version": "1.27.1" + }, + { + "bom-ref": "protobuf==5.29.6", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://developers.google.com/protocol-buffers/" + } + ], + "name": "protobuf", + "purl": "pkg:pypi/protobuf@5.29.6", + "type": "library", + "version": "5.29.6" + }, + { + "bom-ref": "psutil==7.1.3", + "description": "Cross-platform lib for process and system monitoring.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/giampaolo/psutil" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "psutil", + "purl": "pkg:pypi/psutil@7.1.3", + "type": "library", + "version": "7.1.3" + }, + { + "bom-ref": "pure_eval==0.2.3", + "description": "Safely evaluate AST nodes without side effects", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://github.com/alexmojaki/pure_eval" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pure_eval", + "purl": "pkg:pypi/pure-eval@0.2.3", + "type": "library", + "version": "0.2.3" + }, + { + "bom-ref": "py-key-value-aio==0.2.8", + "description": "Async Key-Value", + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "py-key-value-aio", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "disk" + }, + { + "name": "cdx:python:package:required-extra", + "value": "keyring" + }, + { + "name": "cdx:python:package:required-extra", + "value": "memory" + } + ], + "purl": "pkg:pypi/py-key-value-aio@0.2.8", + "type": "library", + "version": "0.2.8" + }, + { + "bom-ref": "py-key-value-shared==0.2.8", + "description": "Shared Key-Value", + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "py-key-value-shared", + "purl": "pkg:pypi/py-key-value-shared@0.2.8", + "type": "library", + "version": "0.2.8" + }, + { + "bom-ref": "py-serializable==2.1.0", + "description": "Library for serializing and deserializing Python Objects to and from JSON and XML.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://py-serializable.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/madpah/serializable/issues" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/madpah/serializable" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/madpah/serializable#readme" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "py-serializable", + "purl": "pkg:pypi/py-serializable@2.1.0", + "type": "library", + "version": "2.1.0" + }, + { + "bom-ref": "pyarrow==23.0.0", + "description": "Python library for Apache Arrow", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://arrow.apache.org/docs/python" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/apache/arrow/issues" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/apache/arrow" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://arrow.apache.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "pyarrow", + "purl": "pkg:pypi/pyarrow@23.0.0", + "type": "library", + "version": "23.0.0" + }, + { + "bom-ref": "pyasn1==0.6.1", + "description": "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pyasn1.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/pyasn1/pyasn1/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pyasn1/pyasn1" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://pyasn1.readthedocs.io/en/latest/changelog.html" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/pyasn1/pyasn1" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-2-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "pyasn1", + "purl": "pkg:pypi/pyasn1@0.6.1", + "type": "library", + "version": "0.6.1" + }, + { + "bom-ref": "pyasn1_modules==0.4.2", + "description": "A collection of ASN.1-based protocols modules", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/pyasn1/pyasn1-modules/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pyasn1/pyasn1-modules" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/pyasn1/pyasn1-modules/blob/master/CHANGES.txt" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/pyasn1/pyasn1-modules" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "pyasn1_modules", + "purl": "pkg:pypi/pyasn1-modules@0.4.2", + "type": "library", + "version": "0.4.2" + }, + { + "bom-ref": "pycodestyle==2.14.0", + "description": "Python style guide checker", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://pycodestyle.pycqa.org/en/latest/developer.html#changes" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://pycodestyle.pycqa.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pycodestyle", + "purl": "pkg:pypi/pycodestyle@2.14.0", + "type": "library", + "version": "2.14.0" + }, + { + "bom-ref": "pycparser==2.23", + "description": "C parser in Python", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/eliben/pycparser" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "pycparser", + "purl": "pkg:pypi/pycparser@2.23", + "type": "library", + "version": "2.23" + }, + { + "bom-ref": "pydantic==2.12.4", + "description": "Data validation using Python type hints", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.pydantic.dev" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pydantic/pydantic" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/samuelcolvin" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://docs.pydantic.dev/latest/changelog/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/pydantic/pydantic" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pydantic", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "email" + } + ], + "purl": "pkg:pypi/pydantic@2.12.4", + "type": "library", + "version": "2.12.4" + }, + { + "bom-ref": "pydantic-settings==2.12.0", + "description": "Settings management using Pydantic", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.pydantic.dev/dev-v2/concepts/pydantic_settings/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pydantic/pydantic-settings" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/samuelcolvin" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/pydantic/pydantic-settings/releases" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/pydantic/pydantic-settings" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pydantic-settings", + "purl": "pkg:pypi/pydantic-settings@2.12.0", + "type": "library", + "version": "2.12.0" + }, + { + "bom-ref": "pydantic_core==2.41.5", + "description": "Core functionality for Pydantic validation and serialization", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pydantic/pydantic-core" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/samuelcolvin" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/pydantic/pydantic-core" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/pydantic/pydantic-core" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pydantic_core", + "purl": "pkg:pypi/pydantic-core@2.41.5", + "type": "library", + "version": "2.41.5" + }, + { + "bom-ref": "pydash==7.0.7", + "description": "The kitchen sink of Python utility libraries for doing \"stuff\" in a functional way. Based on the Lo-Dash Javascript library.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/dgilland/pydash" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pydash", + "purl": "pkg:pypi/pydash@7.0.7", + "type": "library", + "version": "7.0.7" + }, + { + "bom-ref": "pyflakes==3.4.0", + "description": "passive checker of Python programs", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/PyCQA/pyflakes" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pyflakes", + "purl": "pkg:pypi/pyflakes@3.4.0", + "type": "library", + "version": "3.4.0" + }, + { + "bom-ref": "pymdown-extensions==10.21.2", + "description": "Extension pack for Python Markdown.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/facelessuser/pymdown-extensions" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pymdown-extensions", + "purl": "pkg:pypi/pymdown-extensions@10.21.2", + "type": "library", + "version": "10.21.2" + }, + { + "bom-ref": "pyparsing==3.2.5", + "description": "pyparsing - Classes and methods to define and execute parsing grammars", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/pyparsing/pyparsing/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pyparsing", + "purl": "pkg:pypi/pyparsing@3.2.5", + "type": "library", + "version": "3.2.5" + }, + { + "bom-ref": "pyperclip==1.11.0", + "description": "A cross-platform clipboard module for Python. (Only handles plain text for now.)", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/asweigart/pyperclip" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "pyperclip", + "purl": "pkg:pypi/pyperclip@1.11.0", + "type": "library", + "version": "1.11.0" + }, + { + "bom-ref": "pyproject_hooks==1.2.0", + "description": "Wrappers to call pyproject.toml-based build backend hooks.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pyproject-hooks.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pypa/pyproject-hooks" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://pyproject-hooks.readthedocs.io/en/latest/changelog.html" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pyproject_hooks", + "purl": "pkg:pypi/pyproject-hooks@1.2.0", + "type": "library", + "version": "1.2.0" + }, + { + "bom-ref": "pyreadline3==3.5.4", + "description": "A python implementation of GNU readline.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://github.com/pyreadline3/pyreadline3" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/pyreadline3/pyreadline3/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/pyreadline3/pyreadline3/blob/master/doc/ChangeLog" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/pyreadline3/pyreadline3.git" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/pyreadline3/pyreadline3" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "pyreadline3", + "purl": "pkg:pypi/pyreadline3@3.5.4", + "type": "library", + "version": "3.5.4" + }, + { + "bom-ref": "pytest==9.0.1", + "description": "pytest: simple powerful testing with Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/pytest-dev/pytest/issues" + }, + { + "comment": "from packaging metadata Project-URL: Contact", + "type": "other", + "url": "https://docs.pytest.org/en/stable/contact.html" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://docs.pytest.org/en/stable/sponsor.html" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pytest-dev/pytest" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://docs.pytest.org/en/stable/changelog.html" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://docs.pytest.org/en/latest/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pytest", + "purl": "pkg:pypi/pytest@9.0.1", + "type": "library", + "version": "9.0.1" + }, + { + "bom-ref": "pytest-asyncio==1.3.0", + "description": "Pytest support for asyncio", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pytest-asyncio.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/pytest-dev/pytest-asyncio/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/pytest-dev/pytest-asyncio" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://pytest-asyncio.readthedocs.io/en/latest/reference/changelog.html" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/pytest-dev/pytest-asyncio" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "pytest-asyncio", + "purl": "pkg:pypi/pytest-asyncio@1.3.0", + "type": "library", + "version": "1.3.0" + }, + { + "bom-ref": "pytest-cov==7.0.0", + "description": "Pytest plugin for measuring coverage.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pytest-cov.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/pytest-dev/pytest-cov/issues" + }, + { + "comment": "from packaging metadata Project-URL: Sources", + "type": "other", + "url": "https://github.com/pytest-dev/pytest-cov" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://pytest-cov.readthedocs.io/en/latest/changelog.html" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pytest-cov", + "purl": "pkg:pypi/pytest-cov@7.0.0", + "type": "library", + "version": "7.0.0" + }, + { + "bom-ref": "pytest-mock==3.15.1", + "description": "Thin-wrapper around the mock package for easier use with pytest", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pytest-mock.readthedocs.io/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/pytest-dev/pytest-mock/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pytest-dev/pytest-mock/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://pytest-mock.readthedocs.io/en/latest/changelog.html" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/pytest-dev/pytest-mock/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pytest-mock", + "purl": "pkg:pypi/pytest-mock@3.15.1", + "type": "library", + "version": "3.15.1" + }, + { + "bom-ref": "pytest-timeout==2.4.0", + "description": "pytest plugin to abort hanging tests", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/pytest-dev/pytest-timeout" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: DFSG approved" + } + } + ], + "name": "pytest-timeout", + "purl": "pkg:pypi/pytest-timeout@2.4.0", + "type": "library", + "version": "2.4.0" + }, + { + "bom-ref": "python-dateutil==2.9.0.post0", + "description": "Extensions to the standard Python datetime module", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://dateutil.readthedocs.io/en/stable/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/dateutil/dateutil" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/dateutil/dateutil" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "python-dateutil", + "purl": "pkg:pypi/python-dateutil@2.9.0.post0", + "type": "library", + "version": "2.9.0.post0" + }, + { + "bom-ref": "python-docx==1.2.0", + "description": "Create, read, and update Microsoft Word .docx files.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://python-docx.readthedocs.org/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/python-openxml/python-docx/blob/master/HISTORY.rst" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/python-openxml/python-docx" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/python-openxml/python-docx" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "python-docx", + "purl": "pkg:pypi/python-docx@1.2.0", + "type": "library", + "version": "1.2.0" + }, + { + "bom-ref": "python-dotenv==1.1.1", + "description": "Read key-value pairs from a .env file and set them as environment variables", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/theskumar/python-dotenv" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "python-dotenv", + "purl": "pkg:pypi/python-dotenv@1.1.1", + "type": "library", + "version": "1.1.1" + }, + { + "bom-ref": "python-multipart==0.0.20", + "description": "A streaming multipart parser for Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://kludex.github.io/python-multipart/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/Kludex/python-multipart" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/Kludex/python-multipart/blob/master/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/Kludex/python-multipart" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "python-multipart", + "purl": "pkg:pypi/python-multipart@0.0.20", + "type": "library", + "version": "0.0.20" + }, + { + "bom-ref": "pytokens==0.4.1", + "description": "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/tusharsadhwani/pytokens" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pytokens", + "purl": "pkg:pypi/pytokens@0.4.1", + "type": "library", + "version": "0.4.1" + }, + { + "bom-ref": "pytz==2025.2", + "description": "World timezone definitions, modern and historical", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://pypi.org/project/pytz/" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://pythonhosted.org/pytz" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pytz", + "purl": "pkg:pypi/pytz@2025.2", + "type": "library", + "version": "2025.2" + }, + { + "bom-ref": "pywin32==311", + "description": "Python for Window Extensions", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Docs", + "type": "documentation", + "url": "https://mhammond.github.io/pywin32/" + }, + { + "comment": "from packaging metadata Project-URL: Support Requests", + "type": "other", + "url": "https://github.com/mhammond/pywin32/discussions" + }, + { + "comment": "from packaging metadata Project-URL: Bugs", + "type": "other", + "url": "https://github.com/mhammond/pywin32/issues" + }, + { + "comment": "from packaging metadata Project-URL: Mailing List", + "type": "other", + "url": "https://mail.python.org/mailman/listinfo/python-win32" + }, + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://github.com/mhammond/pywin32/blob/main/CHANGES.txt" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/mhammond/pywin32" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Python-2.0" + } + } + ], + "name": "pywin32", + "purl": "pkg:pypi/pywin32@311", + "type": "library", + "version": "311" + }, + { + "bom-ref": "pywin32-ctypes==0.2.3", + "description": "A (partial) reimplementation of pywin32 using ctypes/cffi", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/enthought/pywin32-ctypes" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "pywin32-ctypes", + "purl": "pkg:pypi/pywin32-ctypes@0.2.3", + "type": "library", + "version": "0.2.3" + }, + { + "bom-ref": "pyyaml_env_tag==1.1", + "description": "A custom YAML tag for referencing environment variables in YAML files.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/waylan/pyyaml-env-tag/issues" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/waylan/pyyaml-env-tag" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/waylan/pyyaml-env-tag" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "pyyaml_env_tag", + "purl": "pkg:pypi/pyyaml-env-tag@1.1", + "type": "library", + "version": "1.1" + }, + { + "bom-ref": "pyzmq==27.1.0", + "description": "Python bindings for 0MQ", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pyzmq.readthedocs.org" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/zeromq/pyzmq/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/zeromq/pyzmq" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://pyzmq.readthedocs.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "pyzmq", + "purl": "pkg:pypi/pyzmq@27.1.0", + "type": "library", + "version": "27.1.0" + }, + { + "bom-ref": "referencing==0.36.2", + "description": "JSON Referencing + Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://referencing.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/python-jsonschema/referencing/issues/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/python-jsonschema/referencing" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/Julian" + }, + { + "comment": "from packaging metadata Project-URL: Tidelift", + "type": "other", + "url": "https://tidelift.com/subscription/pkg/pypi-referencing?utm_source=pypi-referencing&utm_medium=referral&utm_campaign=pypi-link" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://referencing.readthedocs.io/en/stable/changes/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/python-jsonschema/referencing" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "referencing", + "purl": "pkg:pypi/referencing@0.36.2", + "type": "library", + "version": "0.36.2" + }, + { + "bom-ref": "regex==2025.11.3", + "description": "Alternative regular expression module, to replace re.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/mrabarnett/mrab-regex" + } + ], + "licenses": [ + { + "acknowledgement": "declared", + "expression": "Apache-2.0 AND CNRI-Python" + } + ], + "name": "regex", + "purl": "pkg:pypi/regex@2025.11.3", + "type": "library", + "version": "2025.11.3" + }, + { + "bom-ref": "reportlab==4.4.2", + "description": "The Reportlab Toolkit", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://www.reportlab.com/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "reportlab", + "purl": "pkg:pypi/reportlab@4.4.2", + "type": "library", + "version": "4.4.2" + }, + { + "bom-ref": "requests==2.32.5", + "description": "Python HTTP for Humans.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://requests.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/psf/requests" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://requests.readthedocs.io" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "requests", + "purl": "pkg:pypi/requests@2.32.5", + "type": "library", + "version": "2.32.5" + }, + { + "bom-ref": "requests-futures==1.0.2", + "description": "Asynchronous Python HTTP for Humans.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/ross/requests-futures" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "requests-futures", + "purl": "pkg:pypi/requests-futures@1.0.2", + "type": "library", + "version": "1.0.2" + }, + { + "bom-ref": "requests-oauthlib==2.0.0", + "description": "OAuthlib authentication support for Requests.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/requests/requests-oauthlib" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "ISC" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "requests-oauthlib", + "purl": "pkg:pypi/requests-oauthlib@2.0.0", + "type": "library", + "version": "2.0.0" + }, + { + "bom-ref": "requests-toolbelt==1.0.0", + "description": "A utility belt for advanced users of python-requests", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/requests/toolbelt" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/requests/toolbelt/blob/master/HISTORY.rst" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://toolbelt.readthedocs.io/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "requests-toolbelt", + "purl": "pkg:pypi/requests-toolbelt@1.0.0", + "type": "library", + "version": "1.0.0" + }, + { + "bom-ref": "rfc3339-validator==0.1.4", + "description": "A pure python RFC3339 validator", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/naimetti/rfc3339-validator" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "rfc3339-validator", + "purl": "pkg:pypi/rfc3339-validator@0.1.4", + "type": "library", + "version": "0.1.4" + }, + { + "bom-ref": "rfc3986-validator==0.1.1", + "description": "Pure python rfc3986 validator", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/naimetti/rfc3986-validator" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "rfc3986-validator", + "purl": "pkg:pypi/rfc3986-validator@0.1.1", + "type": "library", + "version": "0.1.1" + }, + { + "bom-ref": "rfc3987-syntax==1.1.0", + "description": "Helper functions to syntactically validate strings according to RFC 3987.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://github.com/willynilly/rfc3987-syntax#readme" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/willynilly/rfc3987-syntax/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/willynilly/rfc3987-syntax" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/willynilly/rfc3987-syntax" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "rfc3987-syntax", + "purl": "pkg:pypi/rfc3987-syntax@1.1.0", + "type": "library", + "version": "1.1.0" + }, + { + "bom-ref": "rich==13.9.4", + "description": "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://rich.readthedocs.io/en/latest/" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Textualize/rich" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "rich", + "purl": "pkg:pypi/rich@13.9.4", + "type": "library", + "version": "13.9.4" + }, + { + "bom-ref": "rich-rst==1.3.2", + "description": "A beautiful reStructuredText renderer for rich", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://rich-rst.readthedocs.io/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/wasi-master/rich-rst/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/wasi-master/rich-rst" + }, + { + "comment": "from packaging metadata Project-URL: Say Thanks", + "type": "other", + "url": "https://saythanks.io/to/wasi-master" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://wasi-master.github.io/rich-rst" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "rich-rst", + "purl": "pkg:pypi/rich-rst@1.3.2", + "type": "library", + "version": "1.3.2" + }, + { + "bom-ref": "rpds-py==0.29.0", + "description": "Python bindings to Rust's persistent data structures (rpds)", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://rpds.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/crate-py/rpds/issues/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/crate-py/rpds" + }, + { + "comment": "from packaging metadata Project-URL: Upstream", + "type": "other", + "url": "https://github.com/orium/rpds" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/Julian" + }, + { + "comment": "from packaging metadata Project-URL: Tidelift", + "type": "other", + "url": "https://tidelift.com/subscription/pkg/pypi-rpds-py?utm_source=pypi-rpds-py&utm_medium=referral&utm_campaign=pypi-link" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/crate-py/rpds" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "rpds-py", + "purl": "pkg:pypi/rpds-py@0.29.0", + "type": "library", + "version": "0.29.0" + }, + { + "bom-ref": "rsa==4.9.1", + "description": "Pure-Python RSA implementation", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/sybrenstuvel/python-rsa" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://stuvel.eu/rsa" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "rsa", + "purl": "pkg:pypi/rsa@4.9.1", + "type": "library", + "version": "4.9.1" + }, + { + "bom-ref": "ruamel.yaml==0.18.16", + "description": "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://yaml.dev/doc/ruamel-yaml" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://sourceforge.net/p/ruamel-yaml/tickets/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://sourceforge.net/p/ruamel-yaml/code/ci/default/tree/" + }, + { + "comment": "from packaging metadata Project-URL: Home", + "type": "website", + "url": "https://sourceforge.net/p/ruamel-yaml/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "MIT license" + } + } + ], + "name": "ruamel.yaml", + "purl": "pkg:pypi/ruamel.yaml@0.18.16", + "type": "library", + "version": "0.18.16" + }, + { + "bom-ref": "ruamel.yaml.clib==0.2.14", + "description": "C version of reader, parser and emitter for ruamel.yaml derived from libyaml", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://yaml.dev/doc/ruamel.yaml.clib/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://sourceforge.net/p/ruamel-yaml-clib/tickets/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://sourceforge.net/p/ruamel-yaml-clib/code/ci/default/tree/" + }, + { + "comment": "from packaging metadata Project-URL: Home", + "type": "website", + "url": "https://sourceforge.net/p/ruamel-yaml-clib/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "ruamel.yaml.clib", + "purl": "pkg:pypi/ruamel.yaml.clib@0.2.14", + "type": "library", + "version": "0.2.14" + }, + { + "bom-ref": "ruff==0.15.1", + "description": "An extremely fast Python linter and code formatter, written in Rust.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.astral.sh/ruff/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/astral-sh/ruff" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://docs.astral.sh/ruff" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "ruff", + "purl": "pkg:pypi/ruff@0.15.1", + "type": "library", + "version": "0.15.1" + }, + { + "bom-ref": "safetensors==0.7.0", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/huggingface/safetensors" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/huggingface/safetensors" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "safetensors", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "torch" + } + ], + "purl": "pkg:pypi/safetensors@0.7.0", + "type": "library", + "version": "0.7.0" + }, + { + "bom-ref": "semantic-version==2.10.0", + "description": "A library implementing the 'SemVer' scheme.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/rbarrois/python-semanticversion" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "semantic-version", + "purl": "pkg:pypi/semantic-version@2.10.0", + "type": "library", + "version": "2.10.0" + }, + { + "bom-ref": "semgrep==1.155.0", + "description": "Lightweight static analysis for many languages. Find bug variants with patterns that look like source code.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://semgrep.dev/docs" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/semgrep/semgrep/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/semgrep/semgrep/blob/develop/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/semgrep/semgrep" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://semgrep.dev" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "LGPL-2.1-or-later" + } + } + ], + "name": "semgrep", + "purl": "pkg:pypi/semgrep@1.155.0", + "type": "library", + "version": "1.155.0" + }, + { + "bom-ref": "setuptools==80.9.0", + "description": "Easily download, build, install, upgrade, and uninstall Python packages", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://setuptools.pypa.io/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pypa/setuptools" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://setuptools.pypa.io/en/stable/history.html" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "setuptools", + "purl": "pkg:pypi/setuptools@80.9.0", + "type": "library", + "version": "80.9.0" + }, + { + "bom-ref": "shellingham==1.5.4", + "description": "Tool to Detect Surrounding Shell", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/sarugaku/shellingham" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "ISC" + } + } + ], + "name": "shellingham", + "purl": "pkg:pypi/shellingham@1.5.4", + "type": "library", + "version": "1.5.4" + }, + { + "bom-ref": "six==1.17.0", + "description": "Python 2 and 3 compatibility utilities", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/benjaminp/six" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "six", + "purl": "pkg:pypi/six@1.17.0", + "type": "library", + "version": "1.17.0" + }, + { + "bom-ref": "smmap==5.0.2", + "description": "A pure Python implementation of a sliding window memory map manager", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/gitpython-developers/smmap" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "smmap", + "purl": "pkg:pypi/smmap@5.0.2", + "type": "library", + "version": "5.0.2" + }, + { + "bom-ref": "sniffio==1.3.1", + "description": "Sniff out which async library your code is running under", + "evidence": { + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ] + }, + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://sniffio.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://sniffio.readthedocs.io/en/latest/history.html" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/python-trio/sniffio" + } + ], + "licenses": [ + { + "acknowledgement": "declared", + "expression": "MIT OR Apache-2.0" + } + ], + "name": "sniffio", + "purl": "pkg:pypi/sniffio@1.3.1", + "type": "library", + "version": "1.3.1" + }, + { + "bom-ref": "sortedcontainers==2.4.0", + "description": "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://www.grantjenks.com/docs/sortedcontainers/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "sortedcontainers", + "purl": "pkg:pypi/sortedcontainers@2.4.0", + "type": "library", + "version": "2.4.0" + }, + { + "bom-ref": "soupsieve==2.8.3", + "description": "A modern CSS selector implementation for Beautiful Soup.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/facelessuser/soupsieve" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "soupsieve", + "purl": "pkg:pypi/soupsieve@2.8.3", + "type": "library", + "version": "2.8.3" + }, + { + "bom-ref": "sqlite-vec==0.1.6", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://TODO.com" + } + ], + "name": "sqlite-vec", + "purl": "pkg:pypi/sqlite-vec@0.1.6", + "type": "library", + "version": "0.1.6" + }, + { + "bom-ref": "sse-starlette==3.0.3", + "description": "SSE plugin for Starlette", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/sysid/sse-starlette" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "sse-starlette", + "purl": "pkg:pypi/sse-starlette@3.0.3", + "type": "library", + "version": "3.0.3" + }, + { + "bom-ref": "stack-data==0.6.3", + "description": "Extract data from python stack frames and tracebacks for informative displays", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://github.com/alexmojaki/stack_data" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "stack-data", + "purl": "pkg:pypi/stack-data@0.6.3", + "type": "library", + "version": "0.6.3" + }, + { + "bom-ref": "starlette==0.50.0", + "description": "The little ASGI library that shines.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://starlette.dev/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/Kludex/starlette" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/Kludex" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://starlette.dev/release-notes/" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/Kludex/starlette" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "starlette", + "purl": "pkg:pypi/starlette@0.50.0", + "type": "library", + "version": "0.50.0" + }, + { + "bom-ref": "stem==1.8.2", + "description": "Stem is a Python controller library that allows applications to interact with Tor (https://www.torproject.org/).", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://stem.torproject.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "LGPL-3.0-only" + } + } + ], + "name": "stem", + "purl": "pkg:pypi/stem@1.8.2", + "type": "library", + "version": "1.8.2" + }, + { + "bom-ref": "stevedore==5.7.0", + "description": "Manage dynamic plugins for Python applications", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://opendev.org/openstack/stevedore" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://docs.openstack.org/stevedore" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "stevedore", + "purl": "pkg:pypi/stevedore@5.7.0", + "type": "library", + "version": "5.7.0" + }, + { + "bom-ref": "strictyaml==1.7.3", + "description": "Strict, typed YAML parser", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://hitchdev.com/strictyaml/using" + }, + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://hitchdev.com/strictyaml/changelog" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/crdoconnor/strictyaml" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://hitchdev.com/strictyaml" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "strictyaml", + "purl": "pkg:pypi/strictyaml@1.7.3", + "type": "library", + "version": "1.7.3" + }, + { + "bom-ref": "sympy==1.14.0", + "description": "Computer algebra system (CAS) in Python", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/sympy/sympy" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://sympy.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "sympy", + "purl": "pkg:pypi/sympy@1.14.0", + "type": "library", + "version": "1.14.0" + }, + { + "bom-ref": "tabulate==0.9.0", + "description": "Pretty-print tabular data", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/astanin/python-tabulate" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "tabulate", + "purl": "pkg:pypi/tabulate@0.9.0", + "type": "library", + "version": "0.9.0" + }, + { + "bom-ref": "tenacity==9.1.2", + "description": "Retry code until it succeeds", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/jd/tenacity" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "tenacity", + "purl": "pkg:pypi/tenacity@9.1.2", + "type": "library", + "version": "9.1.2" + }, + { + "bom-ref": "textblob==0.19.0", + "description": "Simple, Pythonic text processing. Sentiment analysis, part-of-speech tagging, noun phrase parsing, and more.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/sloria/TextBlob/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/sloria/TextBlob" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://textblob.readthedocs.io/en/latest/changelog.html" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "textblob", + "purl": "pkg:pypi/textblob@0.19.0", + "type": "library", + "version": "0.19.0" + }, + { + "bom-ref": "tiktoken==0.12.0", + "description": "tiktoken is a fast BPE tokeniser for use with OpenAI's models", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://github.com/openai/tiktoken/blob/main/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/openai/tiktoken" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://github.com/openai/tiktoken" + } + ], + "name": "tiktoken", + "purl": "pkg:pypi/tiktoken@0.12.0", + "type": "library", + "version": "0.12.0" + }, + { + "bom-ref": "tokenizers==0.22.1", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/huggingface/tokenizers" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/huggingface/tokenizers" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "tokenizers", + "purl": "pkg:pypi/tokenizers@0.22.1", + "type": "library", + "version": "0.22.1" + }, + { + "bom-ref": "tomli==2.0.2", + "description": "A lil' TOML parser", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/hukkin/tomli/blob/master/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/hukkin/tomli" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "tomli", + "purl": "pkg:pypi/tomli@2.0.2", + "type": "library", + "version": "2.0.2" + }, + { + "bom-ref": "torch==2.9.1", + "description": "Tensors and Dynamic neural networks in Python with strong GPU acceleration", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pytorch.org/docs" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/pytorch/pytorch/issues" + }, + { + "comment": "from packaging metadata Project-URL: Forum", + "type": "other", + "url": "https://discuss.pytorch.org" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/pytorch/pytorch" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://pytorch.org" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "torch", + "purl": "pkg:pypi/torch@2.9.1", + "type": "library", + "version": "2.9.1" + }, + { + "bom-ref": "torchmetrics==1.8.2", + "description": "PyTorch native Metrics", + "externalReferences": [ + { + "comment": "from packaging metadata: Download-URL", + "type": "distribution", + "url": "https://github.com/Lightning-AI/torchmetrics/archive/master.zip" + }, + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://torchmetrics.rtfd.io/en/latest/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/Lightning-AI/torchmetrics/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/Lightning-AI/torchmetrics" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Lightning-AI/torchmetrics" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "torchmetrics", + "purl": "pkg:pypi/torchmetrics@1.8.2", + "type": "library", + "version": "1.8.2" + }, + { + "bom-ref": "tornado==6.5.4", + "description": "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/tornadoweb/tornado" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://www.tornadoweb.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "tornado", + "purl": "pkg:pypi/tornado@6.5.4", + "type": "library", + "version": "6.5.4" + }, + { + "bom-ref": "torrequest==0.1.0", + "description": "A simple interface for HTTP(s) requests over Tor", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://github.com/erdiaker/torrequest" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "torrequest", + "purl": "pkg:pypi/torrequest@0.1.0", + "type": "library", + "version": "0.1.0" + }, + { + "bom-ref": "tqdm==4.67.1", + "description": "Fast, Extensible Progress Meter", + "evidence": { + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)" + } + } + ] + }, + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: wiki", + "type": "other", + "url": "https://github.com/tqdm/tqdm/wiki" + }, + { + "comment": "from packaging metadata Project-URL: changelog", + "type": "release-notes", + "url": "https://tqdm.github.io/releases" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/tqdm/tqdm" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://tqdm.github.io" + } + ], + "licenses": [ + { + "acknowledgement": "declared", + "expression": "MPL-2.0 AND MIT" + } + ], + "name": "tqdm", + "purl": "pkg:pypi/tqdm@4.67.1", + "type": "library", + "version": "4.67.1" + }, + { + "bom-ref": "traitlets==5.14.3", + "description": "Traitlets Python configuration system", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://traitlets.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/ipython/traitlets/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/ipython/traitlets" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://numfocus.org" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/ipython/traitlets" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "traitlets", + "purl": "pkg:pypi/traitlets@5.14.3", + "type": "library", + "version": "5.14.3" + }, + { + "bom-ref": "transformers==4.57.3", + "description": "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/huggingface/transformers" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "transformers", + "purl": "pkg:pypi/transformers@4.57.3", + "type": "library", + "version": "4.57.3" + }, + { + "bom-ref": "trove-classifiers==2026.1.14.14", + "description": "Canonical source for classifiers on PyPI (pypi.org).", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/pypa/trove-classifiers" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "trove-classifiers", + "purl": "pkg:pypi/trove-classifiers@2026.1.14.14", + "type": "library", + "version": "2026.1.14.14" + }, + { + "bom-ref": "typer==0.21.1", + "description": "Typer, build great CLIs. Easy to code. Based on Python type hints.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://typer.tiangolo.com" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/fastapi/typer/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://typer.tiangolo.com/release-notes/" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/fastapi/typer" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/fastapi/typer" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "typer", + "purl": "pkg:pypi/typer@0.21.1", + "type": "library", + "version": "0.21.1" + }, + { + "bom-ref": "typing-inspect==0.9.0", + "description": "Runtime inspection utilities for typing module.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/ilevkivskyi/typing_inspect" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "typing-inspect", + "purl": "pkg:pypi/typing-inspect@0.9.0", + "type": "library", + "version": "0.9.0" + }, + { + "bom-ref": "typing-inspection==0.4.2", + "description": "Runtime typing introspection tools", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pydantic.github.io/typing-inspection/dev/" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/pydantic/typing-inspection" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/pydantic/typing-inspection/blob/main/HISTORY.md" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/pydantic/typing-inspection" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "typing-inspection", + "purl": "pkg:pypi/typing-inspection@0.4.2", + "type": "library", + "version": "0.4.2" + }, + { + "bom-ref": "typing_extensions==4.15.0", + "description": "Backported and Experimental Type Hints for Python 3.9+", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://typing-extensions.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/python/typing_extensions/issues" + }, + { + "comment": "from packaging metadata Project-URL: Q & A", + "type": "other", + "url": "https://github.com/python/typing/discussions" + }, + { + "comment": "from packaging metadata Project-URL: Changes", + "type": "release-notes", + "url": "https://github.com/python/typing_extensions/blob/main/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/python/typing_extensions" + }, + { + "comment": "from packaging metadata Project-URL: Home", + "type": "website", + "url": "https://github.com/python/typing_extensions" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "PSF-2.0" + } + } + ], + "name": "typing_extensions", + "purl": "pkg:pypi/typing-extensions@4.15.0", + "type": "library", + "version": "4.15.0" + }, + { + "bom-ref": "tzdata==2025.2", + "description": "Provider of IANA time zone data", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://tzdata.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Bug Reports", + "type": "issue-tracker", + "url": "https://github.com/python/tzdata/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/python/tzdata" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/python/tzdata" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "tzdata", + "purl": "pkg:pypi/tzdata@2025.2", + "type": "library", + "version": "2025.2" + }, + { + "bom-ref": "uri-template==1.3.0", + "description": "RFC 6570 URI Template Processor", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://gitlab.linss.com/open-source/python/uri-template" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "uri-template", + "purl": "pkg:pypi/uri-template@1.3.0", + "type": "library", + "version": "1.3.0" + }, + { + "bom-ref": "uritemplate==4.2.0", + "description": "Implementation of RFC 6570 URI Templates", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/python-hyper/uritemplate" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://uritemplate.readthedocs.org" + } + ], + "name": "uritemplate", + "purl": "pkg:pypi/uritemplate@4.2.0", + "type": "library", + "version": "4.2.0" + }, + { + "bom-ref": "urllib3==2.5.0", + "description": "HTTP library with thread-safe connection pooling, file post, and more.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://urllib3.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Issue tracker", + "type": "issue-tracker", + "url": "https://github.com/urllib3/urllib3/issues" + }, + { + "comment": "from packaging metadata Project-URL: Code", + "type": "other", + "url": "https://github.com/urllib3/urllib3" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/urllib3/urllib3/blob/main/CHANGES.rst" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "urllib3", + "purl": "pkg:pypi/urllib3@2.5.0", + "type": "library", + "version": "2.5.0" + }, + { + "bom-ref": "uuid_utils==0.14.0", + "description": "Fast, drop-in replacement for Python's uuid module, powered by Rust.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://github.com/aminalaee/uuid-utils" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/aminalaee/uuid-utils/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/aminalaee/uuid-utils" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "uuid_utils", + "purl": "pkg:pypi/uuid-utils@0.14.0", + "type": "library", + "version": "0.14.0" + }, + { + "bom-ref": "uv==0.11.13", + "description": "An extremely fast Python package and project manager, written in Rust.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.astral.sh/uv" + }, + { + "comment": "from packaging metadata Project-URL: Discord", + "type": "other", + "url": "https://discord.gg/astral-sh" + }, + { + "comment": "from packaging metadata Project-URL: Releases", + "type": "other", + "url": "https://github.com/astral-sh/uv/releases" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/astral-sh/uv/blob/main/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/astral-sh/uv" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://pypi.org/project/uv/" + } + ], + "licenses": [ + { + "acknowledgement": "declared", + "expression": "MIT OR Apache-2.0" + } + ], + "name": "uv", + "purl": "pkg:pypi/uv@0.11.13", + "type": "library", + "version": "0.11.13" + }, + { + "bom-ref": "uvicorn==0.38.0", + "description": "The lightning-fast ASGI server.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/Kludex/uvicorn" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/encode" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://uvicorn.dev/release-notes" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://uvicorn.dev/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + } + ], + "name": "uvicorn", + "properties": [ + { + "name": "cdx:python:package:required-extra", + "value": "standard" + } + ], + "purl": "pkg:pypi/uvicorn@0.38.0", + "type": "library", + "version": "0.38.0" + }, + { + "bom-ref": "waitress==3.0.2", + "description": "Waitress WSGI server", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://docs.pylonsproject.org/projects/waitress/en/latest/index.html" + }, + { + "comment": "from packaging metadata Project-URL: Issue Tracker", + "type": "issue-tracker", + "url": "https://github.com/Pylons/waitress/issues" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://docs.pylonsproject.org/projects/waitress/en/latest/index.html#change-history" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/Pylons/waitress" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Zope Public License" + } + } + ], + "name": "waitress", + "purl": "pkg:pypi/waitress@3.0.2", + "type": "library", + "version": "3.0.2" + }, + { + "bom-ref": "watchdog==6.0.0", + "description": "Filesystem events monitoring", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://python-watchdog.readthedocs.io/en/stable/" + }, + { + "comment": "from packaging metadata Project-URL: Issues", + "type": "issue-tracker", + "url": "https://github.com/gorakhargosh/watchdog/issues" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/gorakhargosh/watchdog/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/gorakhargosh/watchdog/blob/master/changelog.rst" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/gorakhargosh/watchdog" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "watchdog", + "purl": "pkg:pypi/watchdog@6.0.0", + "type": "library", + "version": "6.0.0" + }, + { + "bom-ref": "watchfiles==1.1.1", + "description": "Simple, modern and high performance file watching and code reload in python.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://watchfiles.helpmanual.io" + }, + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/samuelcolvin/watchfiles" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://github.com/sponsors/samuelcolvin" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/samuelcolvin/watchfiles/releases" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/samuelcolvin/watchfiles" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/samuelcolvin/watchfiles" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "watchfiles", + "purl": "pkg:pypi/watchfiles@1.1.1", + "type": "library", + "version": "1.1.1" + }, + { + "bom-ref": "wcmatch==8.5.2", + "description": "Wildcard/glob file name matcher.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/facelessuser/wcmatch" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "wcmatch", + "purl": "pkg:pypi/wcmatch@8.5.2", + "type": "library", + "version": "8.5.2" + }, + { + "bom-ref": "wcwidth==0.2.14", + "description": "Measures the displayed width of unicode strings in a terminal", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/jquast/wcwidth" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "wcwidth", + "purl": "pkg:pypi/wcwidth@0.2.14", + "type": "library", + "version": "0.2.14" + }, + { + "bom-ref": "webcolors==25.10.0", + "description": "A library for working with the color formats defined by HTML and CSS.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://webcolors.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Source Code", + "type": "other", + "url": "https://github.com/ubernostrum/webcolors" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "webcolors", + "purl": "pkg:pypi/webcolors@25.10.0", + "type": "library", + "version": "25.10.0" + }, + { + "bom-ref": "websockets==15.0.1", + "description": "An implementation of the WebSocket Protocol (RFC 6455 & 7692)", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://websockets.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Tracker", + "type": "issue-tracker", + "url": "https://github.com/python-websockets/websockets/issues" + }, + { + "comment": "from packaging metadata Project-URL: Funding", + "type": "other", + "url": "https://tidelift.com/subscription/pkg/pypi-websockets?utm_source=pypi-websockets&utm_medium=referral&utm_campaign=readme" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://websockets.readthedocs.io/en/stable/project/changelog.html" + }, + { + "comment": "from packaging metadata Project-URL: Homepage", + "type": "website", + "url": "https://github.com/python-websockets/websockets" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "BSD-3-Clause" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "websockets", + "purl": "pkg:pypi/websockets@15.0.1", + "type": "library", + "version": "15.0.1" + }, + { + "bom-ref": "wfastcgi==3.0.0", + "description": "An IIS-Python bridge based on WSGI and FastCGI.", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://aka.ms/python" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "wfastcgi", + "purl": "pkg:pypi/wfastcgi@3.0.0", + "type": "library", + "version": "3.0.0" + }, + { + "bom-ref": "winrt-Windows.AI.MachineLearning==3.2.1", + "description": "Python projection of Windows Runtime (WinRT) APIs", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pywinrt.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/pywinrt/pywinrt/blob/main/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/pywinrt/pywinrt" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "winrt-Windows.AI.MachineLearning", + "purl": "pkg:pypi/winrt-windows.ai.machinelearning@3.2.1", + "type": "library", + "version": "3.2.1" + }, + { + "bom-ref": "winrt-runtime==3.2.1", + "description": "Python projection of Windows Runtime (WinRT) APIs", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://pywinrt.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://github.com/pywinrt/pywinrt/blob/main/CHANGELOG.md" + }, + { + "comment": "from packaging metadata Project-URL: Repository", + "type": "vcs", + "url": "https://github.com/pywinrt/pywinrt" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "winrt-runtime", + "purl": "pkg:pypi/winrt-runtime@3.2.1", + "type": "library", + "version": "3.2.1" + }, + { + "bom-ref": "wrapt==1.17.3", + "description": "Module for decorators, wrappers and monkey patching.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Documentation", + "type": "documentation", + "url": "https://wrapt.readthedocs.io/" + }, + { + "comment": "from packaging metadata Project-URL: Bug Tracker", + "type": "issue-tracker", + "url": "https://github.com/GrahamDumpleton/wrapt/issues/" + }, + { + "comment": "from packaging metadata Project-URL: Changelog", + "type": "release-notes", + "url": "https://wrapt.readthedocs.io/en/latest/changes.html" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/GrahamDumpleton/wrapt" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "wrapt", + "purl": "pkg:pypi/wrapt@1.17.3", + "type": "library", + "version": "1.17.3" + }, + { + "bom-ref": "xlrd==2.0.2", + "description": "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "http://www.python-excel.org/" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "xlrd", + "purl": "pkg:pypi/xlrd@2.0.2", + "type": "library", + "version": "2.0.2" + }, + { + "bom-ref": "xxhash==3.6.0", + "description": "Python binding for xxHash", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/ifduyue/python-xxhash" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "xxhash", + "purl": "pkg:pypi/xxhash@3.6.0", + "type": "library", + "version": "3.6.0" + }, + { + "bom-ref": "yamllint==1.38.0", + "description": "A linter for YAML files.", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: documentation", + "type": "documentation", + "url": "https://yamllint.readthedocs.io" + }, + { + "comment": "from packaging metadata Project-URL: repository", + "type": "vcs", + "url": "https://github.com/adrienverge/yamllint" + }, + { + "comment": "from packaging metadata Project-URL: homepage", + "type": "website", + "url": "https://github.com/adrienverge/yamllint" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "GPL-3.0-or-later" + } + } + ], + "name": "yamllint", + "purl": "pkg:pypi/yamllint@1.38.0", + "type": "library", + "version": "1.38.0" + }, + { + "bom-ref": "yarl==1.20.1", + "description": "Yet another URL library", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Coverage: codecov", + "type": "other", + "url": "https://codecov.io/github/aio-libs/yarl" + }, + { + "comment": "from packaging metadata Project-URL: Code of Conduct", + "type": "other", + "url": "https://github.com/aio-libs/.github/blob/master/CODE_OF_CONDUCT.md" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: repo", + "type": "other", + "url": "https://github.com/aio-libs/yarl" + }, + { + "comment": "from packaging metadata Project-URL: CI: GitHub Workflows", + "type": "other", + "url": "https://github.com/aio-libs/yarl/actions?query=branch:master" + }, + { + "comment": "from packaging metadata Project-URL: GitHub: issues", + "type": "other", + "url": "https://github.com/aio-libs/yarl/issues" + }, + { + "comment": "from packaging metadata Project-URL: Docs: RTD", + "type": "other", + "url": "https://yarl.aio-libs.org" + }, + { + "comment": "from packaging metadata Project-URL: Docs: Changelog", + "type": "other", + "url": "https://yarl.aio-libs.org/en/latest/changes/" + }, + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/aio-libs/yarl" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + }, + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: Apache Software License" + } + } + ], + "name": "yarl", + "purl": "pkg:pypi/yarl@1.20.1", + "type": "library", + "version": "1.20.1" + }, + { + "bom-ref": "zipp==3.23.0", + "description": "Backport of pathlib-compatible object wrapper for zip files", + "externalReferences": [ + { + "comment": "from packaging metadata Project-URL: Source", + "type": "other", + "url": "https://github.com/jaraco/zipp" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "MIT" + } + } + ], + "name": "zipp", + "purl": "pkg:pypi/zipp@3.23.0", + "type": "library", + "version": "3.23.0" + }, + { + "bom-ref": "zstandard==0.23.0", + "description": "Zstandard bindings for Python", + "externalReferences": [ + { + "comment": "from packaging metadata: Home-page", + "type": "website", + "url": "https://github.com/indygreg/python-zstandard" + } + ], + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "name": "License :: OSI Approved :: BSD License" + } + } + ], + "name": "zstandard", + "purl": "pkg:pypi/zstandard@0.23.0", + "type": "library", + "version": "0.23.0" + } + ], + "dependencies": [ + { + "dependsOn": [ + "cryptography==46.0.3" + ], + "ref": "Authlib==1.6.5" + }, + { + "dependsOn": [ + "mypy==1.19.1" + ], + "ref": "EditorConfig==0.17.1" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "MarkupSafe==3.0.3", + "Werkzeug==3.1.3", + "blinker==1.9.0", + "click==8.1.8", + "importlib_metadata==8.7.0", + "itsdangerous==2.2.0", + "python-dotenv==1.1.1" + ], + "ref": "Flask==3.1.2" + }, + { + "dependsOn": [ + "coverage==7.13.4", + "gitdb==4.0.12", + "mypy==1.19.1", + "pytest-cov==7.0.0", + "pytest-mock==3.15.1", + "pytest==9.0.1", + "typing_extensions==4.15.0" + ], + "ref": "GitPython==3.1.45" + }, + { + "dependsOn": [ + "MarkupSafe==3.0.3", + "babel==2.18.0" + ], + "ref": "Jinja2==3.1.6" + }, + { + "dependsOn": [ + "MarkupSafe==3.0.3", + "babel==2.18.0", + "pytest==9.0.1" + ], + "ref": "Mako==1.3.10" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "coverage==7.13.4", + "mkdocs==1.6.1", + "mkdocstrings==1.0.3" + ], + "ref": "Markdown==3.10.2" + }, + { + "ref": "MarkupSafe==3.0.3" + }, + { + "dependsOn": [ + "coverage==7.13.4", + "cryptography==46.0.3", + "pytest==9.0.1" + ], + "ref": "PyJWT==2.10.1" + }, + { + "ref": "PyMuPDF==1.27.2.3" + }, + { + "ref": "PySocks==1.7.1" + }, + { + "ref": "PyYAML==6.0.3" + }, + { + "dependsOn": [ + "colorama==0.4.6" + ], + "ref": "Pygments==2.19.2" + }, + { + "dependsOn": [ + "aiosqlite==0.22.1", + "greenlet==3.2.4", + "importlib_metadata==8.7.0", + "mypy==1.19.1", + "typing_extensions==4.15.0" + ], + "ref": "SQLAlchemy==2.0.44" + }, + { + "dependsOn": [ + "MarkupSafe==3.0.3", + "watchdog==6.0.0" + ], + "ref": "Werkzeug==3.1.3" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "fastapi==0.123.4", + "httpx==0.28.1", + "langchain-anthropic==0.2.4", + "langchain-core==0.3.84", + "langchain-google-genai==2.1.12", + "langchain-openai==0.2.14", + "langgraph-checkpoint-sqlite==2.0.11", + "langgraph==0.2.76", + "mypy==1.19.1", + "pydantic==2.12.4", + "pytest-asyncio==1.3.0", + "pytest==9.0.1", + "python-dotenv==1.1.1", + "ruff==0.15.1", + "sse-starlette==3.0.3", + "uvicorn==0.38.0" + ], + "ref": "agentic-lg==0.1.0" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "mypy==1.19.1", + "prompts-tools==0.1.0", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "ruff==0.15.1" + ], + "ref": "agentic-v2-eval==0.3.0" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "PyYAML==6.0.3", + "aiofiles==24.1.0", + "aiohttp==3.12.13", + "anthropic==0.79.0", + "black==26.3.1", + "fastapi==0.123.4", + "filelock==3.20.0", + "httpx==0.28.1", + "jmespath==1.1.0", + "lancedb==0.29.2", + "langchain-anthropic==0.2.4", + "langchain-core==0.3.84", + "langchain-google-genai==2.1.12", + "langchain-ollama==0.2.3", + "langchain-openai==0.2.14", + "langchain==0.3.28", + "langgraph-checkpoint-sqlite==2.0.11", + "langgraph==0.2.76", + "langsmith==0.3.45", + "opentelemetry-exporter-otlp-proto-http==1.37.0", + "opentelemetry-sdk==1.37.0", + "prompts-tools==0.1.0", + "pydantic==2.12.4", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "pytest-mock==3.15.1", + "pytest-timeout==2.4.0", + "pytest==9.0.1", + "python-multipart==0.0.20", + "rich==13.9.4", + "ruff==0.15.1", + "typer==0.21.1", + "uvicorn==0.38.0" + ], + "ref": "agentic-workflows-v2==0.1.0" + }, + { + "ref": "aiofiles==24.1.0" + }, + { + "ref": "aiohappyeyeballs==2.6.1" + }, + { + "dependsOn": [ + "aiohappyeyeballs==2.6.1", + "aiosignal==1.3.2", + "attrs==25.3.0", + "frozenlist==1.7.0", + "multidict==6.6.2", + "propcache==0.3.2", + "yarl==1.20.1" + ], + "ref": "aiohttp==3.12.13" + }, + { + "dependsOn": [ + "frozenlist==1.7.0" + ], + "ref": "aiosignal==1.3.2" + }, + { + "dependsOn": [ + "black==26.3.1", + "build==1.4.2", + "coverage==7.13.4", + "flake8==7.3.0", + "mypy==1.19.1" + ], + "ref": "aiosqlite==0.22.1" + }, + { + "dependsOn": [ + "Mako==1.3.10", + "SQLAlchemy==2.0.44", + "tomli==2.0.2", + "typing_extensions==4.15.0", + "tzdata==2025.2" + ], + "ref": "alembic==1.17.2" + }, + { + "dependsOn": [ + "black==26.3.1", + "coverage==7.13.4" + ], + "ref": "aniso8601==10.0.1" + }, + { + "ref": "annotated-doc==0.0.4" + }, + { + "dependsOn": [ + "typing_extensions==4.15.0" + ], + "ref": "annotated-types==0.7.0" + }, + { + "dependsOn": [ + "aiohttp==3.12.13", + "anyio==4.11.0", + "distro==1.9.0", + "docstring_parser==0.17.0", + "google-auth==2.48.0", + "httpx==0.28.1", + "jiter==0.12.0", + "pydantic==2.12.4", + "sniffio==1.3.1", + "typing_extensions==4.15.0" + ], + "ref": "anthropic==0.79.0" + }, + { + "dependsOn": [ + "exceptiongroup==1.2.2", + "idna==3.10", + "sniffio==1.3.1", + "typing_extensions==4.15.0" + ], + "ref": "anyio==4.11.0" + }, + { + "dependsOn": [ + "coverage==7.13.4", + "mypy==1.19.1", + "ruff==0.15.1" + ], + "ref": "argcomplete==3.6.3" + }, + { + "dependsOn": [ + "pytest-cov==7.0.0", + "pytest-mock==3.15.1", + "pytest==9.0.1", + "python-dateutil==2.9.0.post0", + "pytz==2025.2", + "tzdata==2025.2" + ], + "ref": "arrow==1.4.0" + }, + { + "dependsOn": [ + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "asttokens==3.0.1" + }, + { + "dependsOn": [ + "coverage==7.13.4", + "mypy==1.19.1", + "pytest==9.0.1" + ], + "ref": "attrs==25.3.0" + }, + { + "dependsOn": [ + "aiohttp==3.12.13", + "opentelemetry-api==1.37.0", + "requests==2.32.5", + "typing_extensions==4.15.0" + ], + "ref": "azure-core==1.36.0" + }, + { + "dependsOn": [ + "azure-core==1.36.0", + "cryptography==46.0.3", + "msal-extensions==1.3.1", + "msal==1.34.0", + "typing_extensions==4.15.0" + ], + "ref": "azure-identity==1.25.1" + }, + { + "dependsOn": [ + "azure-core==1.36.0", + "azure-identity==1.25.1", + "msrest==0.7.1", + "opentelemetry-api==1.37.0", + "opentelemetry-sdk==1.37.0", + "psutil==7.1.3" + ], + "ref": "azure-monitor-opentelemetry-exporter==1.0.0b45" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "pytz==2025.2", + "setuptools==80.9.0", + "tzdata==2025.2" + ], + "ref": "babel==2.18.0" + }, + { + "dependsOn": [ + "regex==2025.11.3" + ], + "ref": "backrefs==6.2" + }, + { + "dependsOn": [ + "GitPython==3.1.45", + "PyYAML==6.0.3", + "beautifulsoup4==4.14.3", + "colorama==0.4.6", + "coverage==7.13.4", + "flake8==7.3.0", + "rich==13.9.4", + "stevedore==5.7.0", + "tomli==2.0.2" + ], + "ref": "bandit==1.9.4" + }, + { + "dependsOn": [ + "Pygments==2.19.2", + "SQLAlchemy==2.0.44", + "click==8.1.8", + "coverage==7.13.4", + "docutils==0.22.3", + "fastmcp==2.13.1", + "langchain==0.3.28", + "mkdocs-material==9.7.6", + "mkdocstrings-python==2.0.3", + "mypy==1.19.1", + "numpy==2.3.3", + "pytest==9.0.1", + "setuptools==80.9.0", + "torch==2.9.1", + "typer==0.21.1", + "typing_extensions==4.15.0" + ], + "ref": "beartype==0.22.6" + }, + { + "dependsOn": [ + "chardet==5.2.0", + "charset-normalizer==3.4.2", + "lxml==6.0.2", + "soupsieve==2.8.3", + "typing_extensions==4.15.0" + ], + "ref": "beautifulsoup4==4.14.3" + }, + { + "dependsOn": [ + "aiohttp==3.12.13", + "click==8.1.8", + "colorama==0.4.6", + "ipython==9.10.0", + "mypy_extensions==1.1.0", + "packaging==25.0", + "pathspec==1.0.4", + "platformdirs==4.5.0", + "pytokens==0.4.1", + "tomli==2.0.2", + "typing_extensions==4.15.0" + ], + "ref": "black==26.3.1" + }, + { + "ref": "blinker==1.9.0" + }, + { + "ref": "boltons==21.0.0" + }, + { + "dependsOn": [ + "black==26.3.1", + "build==1.4.2", + "pycodestyle==2.14.0", + "pytest==9.0.1" + ], + "ref": "boolean.py==5.0" + }, + { + "ref": "bracex==2.6" + }, + { + "dependsOn": [ + "colorama==0.4.6", + "importlib_metadata==8.7.0", + "packaging==25.0", + "pyproject_hooks==1.2.0", + "tomli==2.0.2", + "uv==0.11.13" + ], + "ref": "build==1.4.2" + }, + { + "ref": "cachetools==6.2.2" + }, + { + "ref": "certifi==2025.6.15" + }, + { + "dependsOn": [ + "pycparser==2.23" + ], + "ref": "cffi==2.0.0" + }, + { + "ref": "chardet==5.2.0" + }, + { + "ref": "charset-normalizer==3.4.2" + }, + { + "dependsOn": [ + "click==8.1.8", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "click-option-group==0.5.9" + }, + { + "dependsOn": [ + "colorama==0.4.6", + "importlib_metadata==8.7.0" + ], + "ref": "click==8.1.8" + }, + { + "ref": "colorama==0.4.6" + }, + { + "dependsOn": [ + "humanfriendly==10.0" + ], + "ref": "coloredlogs==15.0.1" + }, + { + "dependsOn": [ + "black==26.3.1", + "colorama==0.4.6", + "flake8==7.3.0", + "mypy==1.19.1", + "pytest==9.0.1" + ], + "ref": "colorlog==6.10.1" + }, + { + "dependsOn": [ + "pytest==9.0.1" + ], + "ref": "comm==0.2.3" + }, + { + "dependsOn": [ + "matplotlib==3.10.7", + "mypy==1.19.1", + "numpy==2.3.3", + "pillow==11.0.0", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "contourpy==1.3.3" + }, + { + "dependsOn": [ + "tomli==2.0.2" + ], + "ref": "coverage==7.13.4" + }, + { + "dependsOn": [ + "build==1.4.2", + "certifi==2025.6.15", + "cffi==2.0.0", + "click==8.1.8", + "mypy==1.19.1", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "ruff==0.15.1", + "typing_extensions==4.15.0" + ], + "ref": "cryptography==46.0.3" + }, + { + "dependsOn": [ + "ipython==9.10.0", + "matplotlib==3.10.7", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "cycler==0.12.1" + }, + { + "dependsOn": [ + "chardet==5.2.0", + "cyclonedx-python-lib==11.7.0", + "packageurl-python==0.17.6", + "packaging==25.0", + "pip-requirements-parser==32.0.1", + "tomli==2.0.2" + ], + "ref": "cyclonedx-bom==7.3.0" + }, + { + "dependsOn": [ + "jsonschema==4.25.1", + "license-expression==30.4.4", + "lxml==6.0.2", + "packageurl-python==0.17.6", + "py-serializable==2.1.0", + "referencing==0.36.2", + "sortedcontainers==2.4.0", + "typing_extensions==4.15.0" + ], + "ref": "cyclonedx-python-lib==11.7.0" + }, + { + "dependsOn": [ + "GitPython==3.1.45", + "PyYAML==6.0.3", + "attrs==25.3.0", + "coverage==7.13.4", + "docstring_parser==0.17.0", + "pydantic==2.12.4", + "pytest-cov==7.0.0", + "pytest-mock==3.15.1", + "pytest==9.0.1", + "rich-rst==1.3.2", + "rich==13.9.4", + "tomli==2.0.2", + "typing_extensions==4.15.0" + ], + "ref": "cyclopts==4.2.5" + }, + { + "dependsOn": [ + "marshmallow==3.26.1", + "typing-inspect==0.9.0" + ], + "ref": "dataclasses-json==0.6.7" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "SQLAlchemy==2.0.44", + "aiohttp==3.12.13", + "decorator==5.2.1", + "dill==0.4.0", + "faiss-cpu==1.13.2", + "filelock==3.20.0", + "fsspec==2025.10.0", + "httpx==0.28.1", + "huggingface-hub==0.36.0", + "joblib==1.5.3", + "multiprocess==0.70.18", + "numpy==2.3.3", + "packaging==25.0", + "pandas==2.3.2", + "pillow==11.0.0", + "protobuf==5.29.6", + "pyarrow==23.0.0", + "pytest==9.0.1", + "requests==2.32.5", + "ruff==0.15.1", + "tiktoken==0.12.0", + "torch==2.9.1", + "tqdm==4.67.1", + "transformers==4.57.3", + "xxhash==3.6.0", + "zstandard==0.23.0" + ], + "ref": "datasets==4.5.0" + }, + { + "ref": "debugpy==1.8.20" + }, + { + "ref": "decorator==5.2.1" + }, + { + "ref": "defusedxml==0.7.1" + }, + { + "dependsOn": [ + "packaging==25.0" + ], + "ref": "deprecation==2.1.0" + }, + { + "ref": "dill==0.4.0" + }, + { + "ref": "diskcache==5.6.3" + }, + { + "ref": "distro==1.9.0" + }, + { + "dependsOn": [ + "black==26.3.1", + "coverage==7.13.4", + "cryptography==46.0.3", + "flake8==7.3.0", + "httpcore==1.0.9", + "httpx==0.28.1", + "idna==3.10", + "mypy==1.19.1", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "dnspython==2.8.0" + }, + { + "dependsOn": [ + "pytest==9.0.1" + ], + "ref": "docstring_parser==0.17.0" + }, + { + "ref": "docutils==0.22.3" + }, + { + "dependsOn": [ + "aiohttp==3.12.13", + "black==26.3.1", + "certifi==2025.6.15", + "mypy==1.19.1", + "tabulate==0.9.0", + "typing_extensions==4.15.0" + ], + "ref": "edge-tts==7.2.7" + }, + { + "dependsOn": [ + "dnspython==2.8.0", + "idna==3.10" + ], + "ref": "email-validator==2.3.0" + }, + { + "ref": "et_xmlfile==2.0.0" + }, + { + "dependsOn": [ + "pytest==9.0.1" + ], + "ref": "exceptiongroup==1.2.2" + }, + { + "dependsOn": [ + "asttokens==3.0.1", + "coverage==7.13.4", + "ipython==9.10.0", + "pytest==9.0.1", + "rich==13.9.4" + ], + "ref": "executing==2.2.1" + }, + { + "dependsOn": [ + "bandit==1.9.4", + "build==1.4.2", + "httpx==0.28.1", + "mkdocs-material==9.7.6", + "mkdocs==1.6.1", + "mkdocstrings==1.0.3", + "mypy==1.19.1", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "ruff==0.15.1" + ], + "ref": "executionkit==0.1.0" + }, + { + "dependsOn": [ + "boltons==21.0.0" + ], + "ref": "face==26.0.0" + }, + { + "dependsOn": [ + "numpy==2.3.3", + "packaging==25.0" + ], + "ref": "faiss-cpu==1.13.2" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "PyYAML==6.0.3", + "annotated-doc==0.0.4", + "email-validator==2.3.0", + "httpx==0.28.1", + "itsdangerous==2.2.0", + "orjson==3.11.6", + "pydantic-settings==2.12.0", + "pydantic==2.12.4", + "python-multipart==0.0.20", + "starlette==0.50.0", + "typing_extensions==4.15.0", + "uvicorn==0.38.0" + ], + "ref": "fastapi==0.123.4" + }, + { + "dependsOn": [ + "Authlib==1.6.5", + "cyclopts==4.2.5", + "exceptiongroup==1.2.2", + "httpx==0.28.1", + "jsonschema-path==0.3.4", + "mcp==1.23.3", + "openai==1.109.1", + "openapi-pydantic==0.5.1", + "platformdirs==4.5.0", + "py-key-value-aio==0.2.8", + "pydantic==2.12.4", + "pyperclip==1.11.0", + "python-dotenv==1.1.1", + "rich==13.9.4", + "uvicorn==0.38.0", + "websockets==15.0.1" + ], + "ref": "fastmcp==2.13.1" + }, + { + "ref": "filelock==3.20.0" + }, + { + "ref": "filetype==1.2.0" + }, + { + "dependsOn": [ + "mccabe==0.7.0", + "pycodestyle==2.14.0", + "pyflakes==3.4.0" + ], + "ref": "flake8==7.3.0" + }, + { + "dependsOn": [ + "Flask==3.1.2", + "Werkzeug==3.1.3" + ], + "ref": "flask-cors==6.0.1" + }, + { + "dependsOn": [ + "Flask==3.1.2", + "Werkzeug==3.1.3", + "aniso8601==10.0.1", + "black==26.3.1", + "blinker==1.9.0", + "importlib_resources==6.5.2", + "jsonschema==4.25.1", + "pytest-cov==7.0.0", + "pytest-mock==3.15.1", + "pytest==9.0.1", + "referencing==0.36.2", + "setuptools==80.9.0" + ], + "ref": "flask-restx==1.3.2" + }, + { + "ref": "flatbuffers==25.9.23" + }, + { + "dependsOn": [ + "lxml==6.0.2", + "matplotlib==3.10.7", + "sympy==1.14.0" + ], + "ref": "fonttools==4.60.1" + }, + { + "ref": "fqdn==1.5.1" + }, + { + "ref": "frozenlist==1.7.0" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "aiohttp==3.12.13", + "numpy==2.3.3", + "pandas==2.3.2", + "pyarrow==23.0.0", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "pytest-mock==3.15.1", + "pytest-timeout==2.4.0", + "pytest==9.0.1", + "requests==2.32.5", + "ruff==0.15.1", + "tqdm==4.67.1", + "urllib3==2.5.0", + "yarl==1.20.1", + "zstandard==0.23.0" + ], + "ref": "fsspec==2025.10.0" + }, + { + "dependsOn": [ + "Markdown==3.10.2", + "flake8==7.3.0", + "python-dateutil==2.9.0.post0" + ], + "ref": "ghp-import==2.1.0" + }, + { + "ref": "git-filter-repo==2.47.0" + }, + { + "dependsOn": [ + "smmap==5.0.2" + ], + "ref": "gitdb==4.0.12" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "attrs==25.3.0", + "boltons==21.0.0", + "face==26.0.0", + "tomli==2.0.2" + ], + "ref": "glom==25.12.0" + }, + { + "dependsOn": [ + "google-api-core==2.29.0", + "google-auth==2.48.0", + "grpcio==1.76.0", + "proto-plus==1.27.1", + "protobuf==5.29.6" + ], + "ref": "google-ai-generativelanguage==0.11.0" + }, + { + "dependsOn": [ + "google-auth==2.48.0", + "googleapis-common-protos==1.72.0", + "grpcio-status==1.71.2", + "grpcio==1.76.0", + "importlib_metadata==8.7.0", + "proto-plus==1.27.1", + "protobuf==5.29.6", + "requests==2.32.5" + ], + "ref": "google-api-core==2.29.0" + }, + { + "dependsOn": [ + "google-api-core==2.29.0", + "google-auth-httplib2==0.3.0", + "google-auth==2.48.0", + "httplib2==0.31.2", + "uritemplate==4.2.0" + ], + "ref": "google-api-python-client==2.189.0" + }, + { + "dependsOn": [ + "google-auth==2.48.0", + "httplib2==0.31.2" + ], + "ref": "google-auth-httplib2==0.3.0" + }, + { + "dependsOn": [ + "Flask==3.1.2", + "PyJWT==2.10.1", + "aiohttp==3.12.13", + "cryptography==46.0.3", + "grpcio==1.76.0", + "packaging==25.0", + "pyasn1_modules==0.4.2", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "requests==2.32.5", + "rsa==4.9.1", + "urllib3==2.5.0" + ], + "ref": "google-auth==2.48.0" + }, + { + "dependsOn": [ + "aiohttp==3.12.13", + "anyio==4.11.0", + "distro==1.9.0", + "google-auth==2.48.0", + "httpx==0.28.1", + "protobuf==5.29.6", + "pydantic==2.12.4", + "requests==2.32.5", + "sniffio==1.3.1", + "tenacity==9.1.2", + "typing_extensions==4.15.0", + "websockets==15.0.1" + ], + "ref": "google-genai==1.63.0" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "black==26.3.1", + "google-ai-generativelanguage==0.11.0", + "google-api-core==2.29.0", + "google-api-python-client==2.189.0", + "google-auth==2.48.0", + "ipython==9.10.0", + "pandas==2.3.2", + "pillow==11.0.0", + "protobuf==5.29.6", + "pydantic==2.12.4", + "tqdm==4.67.1", + "typing_extensions==4.15.0" + ], + "ref": "google-generativeai==0.8.6" + }, + { + "dependsOn": [ + "requests==2.32.5" + ], + "ref": "google_search_results==2.4.1" + }, + { + "dependsOn": [ + "grpcio==1.76.0", + "protobuf==5.29.6" + ], + "ref": "googleapis-common-protos==1.72.0" + }, + { + "dependsOn": [ + "psutil==7.1.3", + "setuptools==80.9.0" + ], + "ref": "greenlet==3.2.4" + }, + { + "dependsOn": [ + "pip==26.0.1", + "platformdirs==4.5.0" + ], + "ref": "griffelib==2.0.2" + }, + { + "dependsOn": [ + "googleapis-common-protos==1.72.0", + "grpcio==1.76.0", + "protobuf==5.29.6" + ], + "ref": "grpcio-status==1.71.2" + }, + { + "dependsOn": [ + "typing_extensions==4.15.0" + ], + "ref": "grpcio==1.76.0" + }, + { + "ref": "h11==0.16.0" + }, + { + "dependsOn": [ + "packaging==25.0", + "pathspec==1.0.4", + "pluggy==1.6.0", + "tomli==2.0.2", + "trove-classifiers==2026.1.14.14" + ], + "ref": "hatchling==1.29.0" + }, + { + "dependsOn": [ + "anyio==4.11.0", + "certifi==2025.6.15", + "h11==0.16.0" + ], + "ref": "httpcore==1.0.9" + }, + { + "dependsOn": [ + "pyparsing==3.2.5" + ], + "ref": "httplib2==0.31.2" + }, + { + "ref": "httptools==0.7.1" + }, + { + "ref": "httpx-sse==0.4.3" + }, + { + "dependsOn": [ + "Pygments==2.19.2", + "anyio==4.11.0", + "certifi==2025.6.15", + "click==8.1.8", + "httpcore==1.0.9", + "idna==3.10", + "rich==13.9.4", + "zstandard==0.23.0" + ], + "ref": "httpx==0.28.1" + }, + { + "dependsOn": [ + "Authlib==1.6.5", + "Jinja2==3.1.6", + "PyYAML==6.0.3", + "aiohttp==3.12.13", + "fastapi==0.123.4", + "filelock==3.20.0", + "fsspec==2025.10.0", + "httpx==0.28.1", + "itsdangerous==2.2.0", + "jedi==0.19.2", + "mcp==1.23.3", + "mypy==1.19.1", + "numpy==2.3.3", + "packaging==25.0", + "pillow==11.0.0", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "pytest-mock==3.15.1", + "pytest==9.0.1", + "requests==2.32.5", + "ruff==0.15.1", + "safetensors==0.7.0", + "torch==2.9.1", + "tqdm==4.67.1", + "typer==0.21.1", + "typing_extensions==4.15.0", + "urllib3==2.5.0" + ], + "ref": "huggingface-hub==0.36.0" + }, + { + "dependsOn": [ + "pyreadline3==3.5.4" + ], + "ref": "humanfriendly==10.0" + }, + { + "dependsOn": [ + "flake8==7.3.0", + "mypy==1.19.1", + "pytest==9.0.1", + "ruff==0.15.1" + ], + "ref": "idna==3.10" + }, + { + "dependsOn": [ + "importlib_resources==6.5.2", + "ipython==9.10.0", + "packaging==25.0", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "typing_extensions==4.15.0", + "zipp==3.23.0" + ], + "ref": "importlib_metadata==8.7.0" + }, + { + "dependsOn": [ + "pytest-cov==7.0.0", + "pytest==9.0.1", + "zipp==3.23.0" + ], + "ref": "importlib_resources==6.5.2" + }, + { + "ref": "iniconfig==2.3.0" + }, + { + "dependsOn": [ + "comm==0.2.3", + "coverage==7.13.4", + "debugpy==1.8.20", + "ipython==9.10.0", + "jupyter_client==8.8.0", + "jupyter_core==5.9.1", + "matplotlib-inline==0.2.1", + "matplotlib==3.10.7", + "nest-asyncio==1.6.0", + "packaging==25.0", + "psutil==7.1.3", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "pytest-timeout==2.4.0", + "pytest==9.0.1", + "pyzmq==27.1.0", + "tornado==6.5.4", + "traitlets==5.14.3" + ], + "ref": "ipykernel==7.2.0" + }, + { + "dependsOn": [ + "Pygments==2.19.2", + "argcomplete==3.6.3", + "black==26.3.1", + "colorama==0.4.6", + "decorator==5.2.1", + "exceptiongroup==1.2.2", + "ipykernel==7.2.0", + "ipython_pygments_lexers==1.1.1", + "jedi==0.19.2", + "matplotlib-inline==0.2.1", + "matplotlib==3.10.7", + "numpy==2.3.3", + "packaging==25.0", + "pandas==2.3.2", + "prompt_toolkit==3.0.52", + "pytest-asyncio==1.3.0", + "pytest==9.0.1", + "setuptools==80.9.0", + "stack-data==0.6.3", + "traitlets==5.14.3", + "typing_extensions==4.15.0" + ], + "ref": "ipython==9.10.0" + }, + { + "dependsOn": [ + "Pygments==2.19.2" + ], + "ref": "ipython_pygments_lexers==1.1.1" + }, + { + "ref": "isodate==0.7.2" + }, + { + "dependsOn": [ + "arrow==1.4.0" + ], + "ref": "isoduration==20.11.0" + }, + { + "ref": "itsdangerous==2.2.0" + }, + { + "dependsOn": [ + "more-itertools==10.8.0", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "jaraco.classes==3.4.0" + }, + { + "dependsOn": [ + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "jaraco.context==6.0.1" + }, + { + "dependsOn": [ + "jaraco.classes==3.4.0", + "more-itertools==10.8.0", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "jaraco.functools==4.3.0" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "MarkupSafe==3.0.3", + "Pygments==2.19.2", + "attrs==25.3.0", + "babel==2.18.0", + "chardet==5.2.0", + "colorama==0.4.6", + "docutils==0.22.3", + "flake8==7.3.0", + "idna==3.10", + "mypy==1.19.1", + "packaging==25.0", + "parso==0.8.6", + "pyparsing==3.2.5", + "pytest==9.0.1", + "pytz==2025.2", + "requests==2.32.5", + "six==1.17.0", + "urllib3==2.5.0" + ], + "ref": "jedi==0.19.2" + }, + { + "ref": "jiter==0.12.0" + }, + { + "ref": "jmespath==1.1.0" + }, + { + "ref": "joblib==1.5.3" + }, + { + "dependsOn": [ + "EditorConfig==0.17.1", + "six==1.17.0" + ], + "ref": "jsbeautifier==1.15.4" + }, + { + "dependsOn": [ + "jsonpointer==3.0.0" + ], + "ref": "jsonpatch==1.33" + }, + { + "ref": "jsonpointer==3.0.0" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "pathable==0.4.4", + "referencing==0.36.2", + "requests==2.32.5" + ], + "ref": "jsonschema-path==0.3.4" + }, + { + "dependsOn": [ + "referencing==0.36.2" + ], + "ref": "jsonschema-specifications==2025.9.1" + }, + { + "dependsOn": [ + "attrs==25.3.0", + "fqdn==1.5.1", + "idna==3.10", + "isoduration==20.11.0", + "jsonpointer==3.0.0", + "jsonschema-specifications==2025.9.1", + "referencing==0.36.2", + "rfc3339-validator==0.1.4", + "rfc3986-validator==0.1.1", + "rfc3987-syntax==1.1.0", + "rpds-py==0.29.0", + "uri-template==1.3.0", + "webcolors==25.10.0" + ], + "ref": "jsonschema==4.25.1" + }, + { + "dependsOn": [ + "anyio==4.11.0", + "coverage==7.13.4", + "ipykernel==7.2.0", + "jupyter_core==5.9.1", + "mypy==1.19.1", + "orjson==3.11.6", + "pytest-cov==7.0.0", + "pytest-timeout==2.4.0", + "pytest==9.0.1", + "python-dateutil==2.9.0.post0", + "pyzmq==27.1.0", + "tornado==6.5.4", + "traitlets==5.14.3" + ], + "ref": "jupyter_client==8.8.0" + }, + { + "dependsOn": [ + "ipykernel==7.2.0", + "platformdirs==4.5.0", + "pytest-cov==7.0.0", + "pytest-timeout==2.4.0", + "pytest==9.0.1", + "traitlets==5.14.3" + ], + "ref": "jupyter_core==5.9.1" + }, + { + "dependsOn": [ + "importlib_metadata==8.7.0", + "importlib_resources==6.5.2", + "jaraco.classes==3.4.0", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "pywin32-ctypes==0.2.3" + ], + "ref": "keyring==24.3.1" + }, + { + "ref": "kiwisolver==1.4.9" + }, + { + "dependsOn": [ + "pydantic==2.12.4", + "python-dateutil==2.9.0.post0", + "typing_extensions==4.15.0", + "urllib3==2.5.0" + ], + "ref": "lance-namespace-urllib3-client==0.5.2" + }, + { + "dependsOn": [ + "lance-namespace-urllib3-client==0.5.2" + ], + "ref": "lance-namespace==0.5.2" + }, + { + "dependsOn": [ + "aiohttp==3.12.13", + "deprecation==2.1.0", + "google-generativeai==0.8.6", + "huggingface-hub==0.36.0", + "lance-namespace==0.5.2", + "mkdocs-material==9.7.6", + "mkdocs==1.6.1", + "mkdocstrings-python==2.0.3", + "numpy==2.3.3", + "ollama==0.6.1", + "openai==1.109.1", + "packaging==25.0", + "pandas==2.3.2", + "pillow==11.0.0", + "pyarrow==23.0.0", + "pydantic==2.12.4", + "pytest-asyncio==1.3.0", + "pytest-mock==3.15.1", + "pytest==9.0.1", + "pytz==2025.2", + "requests==2.32.5", + "ruff==0.15.1", + "torch==2.9.1", + "tqdm==4.67.1", + "transformers==4.57.3", + "typing_extensions==4.15.0" + ], + "ref": "lancedb==0.29.2" + }, + { + "dependsOn": [ + "anthropic==0.79.0", + "defusedxml==0.7.1", + "langchain-core==0.3.84", + "pydantic==2.12.4" + ], + "ref": "langchain-anthropic==0.2.4" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "SQLAlchemy==2.0.44", + "langchain-anthropic==0.2.4", + "langchain-core==0.3.84", + "langchain-google-genai==2.1.12", + "langchain-ollama==0.2.3", + "langchain-openai==0.2.14", + "langchain-text-splitters==0.3.11", + "langsmith==0.3.45", + "pydantic==2.12.4", + "requests==2.32.5" + ], + "ref": "langchain-classic==1.0.1" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "SQLAlchemy==2.0.44", + "aiohttp==3.12.13", + "dataclasses-json==0.6.7", + "httpx-sse==0.4.3", + "langchain-classic==1.0.1", + "langchain-core==0.3.84", + "langsmith==0.3.45", + "numpy==2.3.3", + "pydantic-settings==2.12.0", + "requests==2.32.5", + "tenacity==9.1.2" + ], + "ref": "langchain-community==0.4.1" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "jsonpatch==1.33", + "langsmith==0.3.45", + "packaging==25.0", + "pydantic==2.12.4", + "tenacity==9.1.2", + "typing_extensions==4.15.0", + "uuid_utils==0.14.0" + ], + "ref": "langchain-core==0.3.84" + }, + { + "dependsOn": [ + "filetype==1.2.0", + "google-ai-generativelanguage==0.11.0", + "langchain-core==0.3.84", + "pydantic==2.12.4" + ], + "ref": "langchain-google-genai==2.1.12" + }, + { + "dependsOn": [ + "langchain-core==0.3.84", + "ollama==0.6.1" + ], + "ref": "langchain-ollama==0.2.3" + }, + { + "dependsOn": [ + "langchain-core==0.3.84", + "openai==1.109.1", + "tiktoken==0.12.0" + ], + "ref": "langchain-openai==0.2.14" + }, + { + "dependsOn": [ + "langchain-core==0.3.84" + ], + "ref": "langchain-text-splitters==0.3.11" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "SQLAlchemy==2.0.44", + "langchain-anthropic==0.2.4", + "langchain-community==0.4.1", + "langchain-core==0.3.84", + "langchain-google-genai==2.1.12", + "langchain-ollama==0.2.3", + "langchain-openai==0.2.14", + "langchain-text-splitters==0.3.11", + "langsmith==0.3.45", + "pydantic==2.12.4", + "requests==2.32.5" + ], + "ref": "langchain==0.3.28" + }, + { + "dependsOn": [ + "aiosqlite==0.22.1", + "langgraph-checkpoint==2.1.2", + "sqlite-vec==0.1.6" + ], + "ref": "langgraph-checkpoint-sqlite==2.0.11" + }, + { + "dependsOn": [ + "langchain-core==0.3.84", + "ormsgpack==1.12.2" + ], + "ref": "langgraph-checkpoint==2.1.2" + }, + { + "dependsOn": [ + "langchain-core==0.3.84", + "langgraph-checkpoint==2.1.2" + ], + "ref": "langgraph-prebuilt==1.0.7" + }, + { + "dependsOn": [ + "httpx==0.28.1", + "orjson==3.11.6" + ], + "ref": "langgraph-sdk==0.1.74" + }, + { + "dependsOn": [ + "langchain-core==0.3.84", + "langgraph-checkpoint==2.1.2", + "langgraph-sdk==0.1.74" + ], + "ref": "langgraph==0.2.76" + }, + { + "dependsOn": [ + "httpx==0.28.1", + "opentelemetry-api==1.37.0", + "opentelemetry-exporter-otlp-proto-http==1.37.0", + "opentelemetry-sdk==1.37.0", + "orjson==3.11.6", + "packaging==25.0", + "pydantic==2.12.4", + "pytest==9.0.1", + "requests-toolbelt==1.0.0", + "requests==2.32.5", + "rich==13.9.4", + "zstandard==0.23.0" + ], + "ref": "langsmith==0.3.45" + }, + { + "dependsOn": [ + "regex==2025.11.3" + ], + "ref": "lark==1.3.1" + }, + { + "ref": "librt==0.8.0" + }, + { + "dependsOn": [ + "boolean.py==5.0", + "pytest==9.0.1", + "ruff==0.15.1" + ], + "ref": "license-expression==30.4.4" + }, + { + "dependsOn": [ + "importlib_metadata==8.7.0", + "mypy==1.19.1", + "packaging==25.0", + "requests==2.32.5", + "setuptools==80.9.0", + "typing_extensions==4.15.0" + ], + "ref": "lightning-utilities==0.15.2" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "anthropic==0.79.0", + "google-generativeai==0.8.6", + "keyring==24.3.1", + "onnxruntime-genai==0.11.4", + "openai==1.109.1", + "platformdirs==4.5.0", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "llm-maestro==0.1.0" + }, + { + "dependsOn": [ + "beautifulsoup4==4.14.3" + ], + "ref": "lxml==6.0.2" + }, + { + "dependsOn": [ + "Markdown==3.10.2", + "PyYAML==6.0.3", + "coverage==7.13.4", + "mdurl==0.1.2", + "psutil==7.1.3", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "markdown-it-py==3.0.0" + }, + { + "dependsOn": [ + "packaging==25.0", + "pytest==9.0.1" + ], + "ref": "marshmallow==3.26.1" + }, + { + "dependsOn": [ + "flake8==7.3.0", + "pytest==9.0.1", + "traitlets==5.14.3" + ], + "ref": "matplotlib-inline==0.2.1" + }, + { + "dependsOn": [ + "contourpy==1.3.3", + "cycler==0.12.1", + "fonttools==4.60.1", + "kiwisolver==1.4.9", + "numpy==2.3.3", + "packaging==25.0", + "pillow==11.0.0", + "pyparsing==3.2.5", + "python-dateutil==2.9.0.post0", + "setuptools==80.9.0" + ], + "ref": "matplotlib==3.10.7" + }, + { + "ref": "mccabe==0.7.0" + }, + { + "dependsOn": [ + "PyJWT==2.10.1", + "anyio==4.11.0", + "httpx-sse==0.4.3", + "httpx==0.28.1", + "jsonschema==4.25.1", + "pydantic-settings==2.12.0", + "pydantic==2.12.4", + "python-dotenv==1.1.1", + "python-multipart==0.0.20", + "pywin32==311", + "rich==13.9.4", + "sse-starlette==3.0.3", + "starlette==0.50.0", + "typer==0.21.1", + "typing-inspection==0.4.2", + "typing_extensions==4.15.0", + "uvicorn==0.38.0", + "websockets==15.0.1" + ], + "ref": "mcp==1.23.3" + }, + { + "ref": "mdurl==0.1.2" + }, + { + "ref": "mergedeep==1.3.4" + }, + { + "dependsOn": [ + "Markdown==3.10.2", + "MarkupSafe==3.0.3", + "mkdocs==1.6.1" + ], + "ref": "mkdocs-autorefs==1.4.4" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "importlib_metadata==8.7.0", + "mergedeep==1.3.4", + "platformdirs==4.5.0" + ], + "ref": "mkdocs-get-deps==0.2.2" + }, + { + "dependsOn": [ + "GitPython==3.1.45", + "babel==2.18.0", + "mkdocs==1.6.1", + "tzdata==2025.2" + ], + "ref": "mkdocs-git-revision-date-localized-plugin==1.5.1" + }, + { + "ref": "mkdocs-material-extensions==1.3.1" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "Markdown==3.10.2", + "Pygments==2.19.2", + "babel==2.18.0", + "backrefs==6.2", + "colorama==0.4.6", + "mkdocs-git-revision-date-localized-plugin==1.5.1", + "mkdocs-material-extensions==1.3.1", + "mkdocs==1.6.1", + "paginate==0.5.7", + "pillow==11.0.0", + "pymdown-extensions==10.21.2", + "requests==2.32.5" + ], + "ref": "mkdocs-material==9.7.6" + }, + { + "dependsOn": [ + "beautifulsoup4==4.14.3", + "jsbeautifier==1.15.4", + "mkdocs-material==9.7.6", + "mkdocs==1.6.1", + "packaging==25.0", + "pymdown-extensions==10.21.2", + "requests==2.32.5", + "setuptools==80.9.0" + ], + "ref": "mkdocs-mermaid2-plugin==1.2.3" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "Markdown==3.10.2", + "MarkupSafe==3.0.3", + "PyYAML==6.0.3", + "babel==2.18.0", + "click==8.1.8", + "colorama==0.4.6", + "ghp-import==2.1.0", + "importlib_metadata==8.7.0", + "mergedeep==1.3.4", + "mkdocs-get-deps==0.2.2", + "packaging==25.0", + "pathspec==1.0.4", + "pyyaml_env_tag==1.1", + "watchdog==6.0.0" + ], + "ref": "mkdocs==1.6.1" + }, + { + "dependsOn": [ + "griffelib==2.0.2", + "mkdocs-autorefs==1.4.4", + "mkdocstrings==1.0.3", + "typing_extensions==4.15.0" + ], + "ref": "mkdocstrings-python==2.0.3" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "Markdown==3.10.2", + "MarkupSafe==3.0.3", + "mkdocs-autorefs==1.4.4", + "mkdocs==1.6.1", + "mkdocstrings-python==2.0.3", + "pymdown-extensions==10.21.2" + ], + "ref": "mkdocstrings==1.0.3" + }, + { + "dependsOn": [ + "numpy==2.3.3", + "pytest==9.0.1" + ], + "ref": "ml_dtypes==0.5.4" + }, + { + "ref": "more-itertools==10.8.0" + }, + { + "dependsOn": [ + "pycodestyle==2.14.0", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "mpmath==1.3.0" + }, + { + "dependsOn": [ + "msal==1.34.0" + ], + "ref": "msal-extensions==1.3.1" + }, + { + "dependsOn": [ + "PyJWT==2.10.1", + "cryptography==46.0.3", + "requests==2.32.5" + ], + "ref": "msal==1.34.0" + }, + { + "dependsOn": [ + "aiohttp==3.12.13", + "azure-core==1.36.0", + "certifi==2025.6.15", + "isodate==0.7.2", + "requests-oauthlib==2.0.0", + "requests==2.32.5" + ], + "ref": "msrest==0.7.1" + }, + { + "dependsOn": [ + "typing_extensions==4.15.0" + ], + "ref": "multidict==6.6.2" + }, + { + "dependsOn": [ + "dill==0.4.0" + ], + "ref": "multiprocess==0.70.18" + }, + { + "dependsOn": [ + "librt==0.8.0", + "lxml==6.0.2", + "mypy_extensions==1.1.0", + "orjson==3.11.6", + "pathspec==1.0.4", + "pip==26.0.1", + "psutil==7.1.3", + "setuptools==80.9.0", + "tomli==2.0.2", + "typing_extensions==4.15.0" + ], + "ref": "mypy==1.19.1" + }, + { + "ref": "mypy_extensions==1.1.0" + }, + { + "ref": "nest-asyncio==1.6.0" + }, + { + "dependsOn": [ + "build==1.4.2", + "lxml==6.0.2", + "matplotlib==3.10.7", + "mypy==1.19.1", + "numpy==2.3.3", + "pandas==2.3.2", + "pillow==11.0.0", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "sympy==1.14.0" + ], + "ref": "networkx==3.6" + }, + { + "dependsOn": [ + "click==8.1.8", + "joblib==1.5.3", + "matplotlib==3.10.7", + "numpy==2.3.3", + "pyparsing==3.2.5", + "regex==2025.11.3", + "requests==2.32.5", + "tqdm==4.67.1" + ], + "ref": "nltk==3.9.2" + }, + { + "ref": "numpy==2.3.3" + }, + { + "dependsOn": [ + "PyJWT==2.10.1", + "blinker==1.9.0", + "cryptography==46.0.3" + ], + "ref": "oauthlib==3.3.1" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "azure-identity==1.25.1", + "numpy==2.3.3", + "onnx-ir==0.1.12", + "onnx==1.20.0", + "onnxruntime-directml==1.23.0", + "onnxruntime-gpu==1.24.1", + "onnxruntime==1.23.2", + "onnxscript==0.5.6", + "optimum==2.0.0", + "optuna==4.6.0", + "pandas==2.3.2", + "psutil==7.1.3", + "pydantic==2.12.4", + "torch==2.9.1", + "torchmetrics==1.8.2", + "transformers==4.57.3" + ], + "ref": "olive-ai==0.10.1" + }, + { + "dependsOn": [ + "httpx==0.28.1", + "pydantic==2.12.4" + ], + "ref": "ollama==0.6.1" + }, + { + "dependsOn": [ + "ml_dtypes==0.5.4", + "numpy==2.3.3", + "onnx==1.20.0", + "typing_extensions==4.15.0" + ], + "ref": "onnx-ir==0.1.12" + }, + { + "dependsOn": [ + "ml_dtypes==0.5.4", + "numpy==2.3.3", + "pillow==11.0.0", + "protobuf==5.29.6", + "typing_extensions==4.15.0" + ], + "ref": "onnx==1.20.0" + }, + { + "dependsOn": [ + "coloredlogs==15.0.1", + "flatbuffers==25.9.23", + "numpy==2.3.3", + "packaging==25.0", + "protobuf==5.29.6", + "sympy==1.14.0" + ], + "ref": "onnxruntime-directml==1.23.0" + }, + { + "dependsOn": [ + "numpy==2.3.3", + "onnxruntime-gpu==1.24.1" + ], + "ref": "onnxruntime-genai-cuda==0.12.0" + }, + { + "dependsOn": [ + "numpy==2.3.3", + "onnxruntime-directml==1.23.0" + ], + "ref": "onnxruntime-genai-directml==0.10.0" + }, + { + "dependsOn": [ + "numpy==2.3.3", + "onnxruntime==1.23.2" + ], + "ref": "onnxruntime-genai==0.11.4" + }, + { + "dependsOn": [ + "flatbuffers==25.9.23", + "numpy==2.3.3", + "packaging==25.0", + "protobuf==5.29.6", + "sympy==1.14.0" + ], + "ref": "onnxruntime-gpu==1.24.1" + }, + { + "dependsOn": [ + "coloredlogs==15.0.1", + "flatbuffers==25.9.23", + "numpy==2.3.3", + "packaging==25.0", + "protobuf==5.29.6", + "sympy==1.14.0" + ], + "ref": "onnxruntime==1.23.2" + }, + { + "dependsOn": [ + "ml_dtypes==0.5.4", + "numpy==2.3.3", + "onnx-ir==0.1.12", + "onnx==1.20.0", + "packaging==25.0", + "typing_extensions==4.15.0" + ], + "ref": "onnxscript==0.5.6" + }, + { + "dependsOn": [ + "aiohttp==3.12.13", + "anyio==4.11.0", + "distro==1.9.0", + "httpx==0.28.1", + "jiter==0.12.0", + "numpy==2.3.3", + "pandas==2.3.2", + "pydantic==2.12.4", + "sniffio==1.3.1", + "tqdm==4.67.1", + "typing_extensions==4.15.0", + "websockets==15.0.1" + ], + "ref": "openai==1.109.1" + }, + { + "dependsOn": [ + "pydantic==2.12.4" + ], + "ref": "openapi-pydantic==0.5.1" + }, + { + "dependsOn": [ + "et_xmlfile==2.0.0" + ], + "ref": "openpyxl==3.1.5" + }, + { + "dependsOn": [ + "importlib_metadata==8.7.0", + "typing_extensions==4.15.0" + ], + "ref": "opentelemetry-api==1.37.0" + }, + { + "dependsOn": [ + "opentelemetry-proto==1.37.0" + ], + "ref": "opentelemetry-exporter-otlp-proto-common==1.37.0" + }, + { + "dependsOn": [ + "googleapis-common-protos==1.72.0", + "opentelemetry-api==1.37.0", + "opentelemetry-exporter-otlp-proto-common==1.37.0", + "opentelemetry-proto==1.37.0", + "opentelemetry-sdk==1.37.0", + "requests==2.32.5", + "typing_extensions==4.15.0" + ], + "ref": "opentelemetry-exporter-otlp-proto-http==1.37.0" + }, + { + "dependsOn": [ + "opentelemetry-api==1.37.0", + "opentelemetry-instrumentation==0.58b0", + "opentelemetry-semantic-conventions==0.58b0", + "opentelemetry-util-http==0.58b0", + "requests==2.32.5" + ], + "ref": "opentelemetry-instrumentation-requests==0.58b0" + }, + { + "dependsOn": [ + "opentelemetry-api==1.37.0", + "opentelemetry-instrumentation==0.58b0", + "wrapt==1.17.3" + ], + "ref": "opentelemetry-instrumentation-threading==0.58b0" + }, + { + "dependsOn": [ + "opentelemetry-api==1.37.0", + "opentelemetry-semantic-conventions==0.58b0", + "packaging==25.0", + "wrapt==1.17.3" + ], + "ref": "opentelemetry-instrumentation==0.58b0" + }, + { + "dependsOn": [ + "protobuf==5.29.6" + ], + "ref": "opentelemetry-proto==1.37.0" + }, + { + "dependsOn": [ + "opentelemetry-api==1.37.0", + "opentelemetry-semantic-conventions==0.58b0", + "typing_extensions==4.15.0" + ], + "ref": "opentelemetry-sdk==1.37.0" + }, + { + "dependsOn": [ + "opentelemetry-api==1.37.0", + "typing_extensions==4.15.0" + ], + "ref": "opentelemetry-semantic-conventions==0.58b0" + }, + { + "ref": "opentelemetry-util-http==0.58b0" + }, + { + "dependsOn": [ + "black==26.3.1", + "huggingface-hub==0.36.0", + "numpy==2.3.3", + "optuna==4.6.0", + "packaging==25.0", + "pillow==11.0.0", + "pytest==9.0.1", + "requests==2.32.5", + "ruff==0.15.1", + "torch==2.9.1", + "tqdm==4.67.1", + "transformers==4.57.3" + ], + "ref": "optimum==2.0.0" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "SQLAlchemy==2.0.44", + "alembic==1.17.2", + "black==26.3.1", + "colorlog==6.10.1", + "coverage==7.13.4", + "flake8==7.3.0", + "greenlet==3.2.4", + "grpcio==1.76.0", + "matplotlib==3.10.7", + "mypy==1.19.1", + "numpy==2.3.3", + "packaging==25.0", + "pandas==2.3.2", + "pillow==11.0.0", + "protobuf==5.29.6", + "pytest==9.0.1", + "torch==2.9.1", + "tqdm==4.67.1", + "typing_extensions==4.15.0" + ], + "ref": "optuna==4.6.0" + }, + { + "ref": "orjson==3.11.6" + }, + { + "ref": "ormsgpack==1.12.2" + }, + { + "dependsOn": [ + "SQLAlchemy==2.0.44", + "black==26.3.1", + "mypy==1.19.1", + "pytest==9.0.1", + "setuptools==80.9.0" + ], + "ref": "packageurl-python==0.17.6" + }, + { + "ref": "packaging==25.0" + }, + { + "dependsOn": [ + "black==26.3.1", + "pytest==9.0.1" + ], + "ref": "paginate==0.5.7" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "SQLAlchemy==2.0.44", + "beautifulsoup4==4.14.3", + "fsspec==2025.10.0", + "lxml==6.0.2", + "matplotlib==3.10.7", + "numpy==2.3.3", + "openpyxl==3.1.5", + "pyarrow==23.0.0", + "pytest==9.0.1", + "python-dateutil==2.9.0.post0", + "pytz==2025.2", + "tabulate==0.9.0", + "tzdata==2025.2", + "xlrd==2.0.2", + "zstandard==0.23.0" + ], + "ref": "pandas==2.3.2" + }, + { + "dependsOn": [ + "flake8==7.3.0", + "pytest==9.0.1" + ], + "ref": "parso==0.8.6" + }, + { + "ref": "pathable==0.4.4" + }, + { + "dependsOn": [ + "pytest==9.0.1", + "typing_extensions==4.15.0" + ], + "ref": "pathspec==1.0.4" + }, + { + "dependsOn": [ + "click==8.1.8", + "pytest==9.0.1", + "urllib3==2.5.0" + ], + "ref": "pathvalidate==3.3.1" + }, + { + "dependsOn": [ + "pillow==11.0.0" + ], + "ref": "pdf2image==1.17.0" + }, + { + "ref": "peewee==3.19.0" + }, + { + "dependsOn": [ + "coverage==7.13.4", + "defusedxml==0.7.1", + "packaging==25.0", + "pytest-cov==7.0.0", + "pytest-timeout==2.4.0", + "pytest==9.0.1", + "typing_extensions==4.15.0" + ], + "ref": "pillow==11.0.0" + }, + { + "dependsOn": [ + "black==26.3.1", + "packaging==25.0", + "pyparsing==3.2.5", + "pytest==9.0.1" + ], + "ref": "pip-requirements-parser==32.0.1" + }, + { + "ref": "pip==26.0.1" + }, + { + "ref": "pip==26.1" + }, + { + "dependsOn": [ + "mypy==1.19.1", + "pytest-cov==7.0.0", + "pytest-mock==3.15.1", + "pytest==9.0.1" + ], + "ref": "platformdirs==4.5.0" + }, + { + "dependsOn": [ + "coverage==7.13.4", + "pytest==9.0.1" + ], + "ref": "pluggy==1.6.0" + }, + { + "dependsOn": [ + "wcwidth==0.2.14" + ], + "ref": "prompt_toolkit==3.0.52" + }, + { + "dependsOn": [ + "Flask==3.1.2", + "azure-identity==1.25.1", + "docstring_parser==0.17.0", + "fastapi==0.123.4", + "filetype==1.2.0", + "jsonschema==4.25.1", + "promptflow-tracing==1.18.1", + "psutil==7.1.3", + "python-dateutil==2.9.0.post0", + "ruamel.yaml==0.18.16" + ], + "ref": "promptflow-core==1.18.1" + }, + { + "dependsOn": [ + "GitPython==3.1.45", + "SQLAlchemy==2.0.44", + "argcomplete==3.6.3", + "azure-monitor-opentelemetry-exporter==1.0.0b45", + "colorama==0.4.6", + "cryptography==46.0.3", + "filelock==3.20.0", + "flask-cors==6.0.1", + "flask-restx==1.3.2", + "httpx==0.28.1", + "keyring==24.3.1", + "marshmallow==3.26.1", + "opentelemetry-exporter-otlp-proto-http==1.37.0", + "pandas==2.3.2", + "pillow==11.0.0", + "promptflow-core==1.18.1", + "pyarrow==23.0.0", + "pydash==7.0.7", + "python-dotenv==1.1.1", + "pywin32==311", + "strictyaml==1.7.3", + "tabulate==0.9.0", + "waitress==3.0.2" + ], + "ref": "promptflow-devkit==1.18.1" + }, + { + "dependsOn": [ + "google_search_results==2.4.1", + "openai==1.109.1", + "promptflow==1.18.1" + ], + "ref": "promptflow-tools==1.6.1" + }, + { + "dependsOn": [ + "openai==1.109.1", + "opentelemetry-sdk==1.37.0", + "tiktoken==0.12.0" + ], + "ref": "promptflow-tracing==1.18.1" + }, + { + "dependsOn": [ + "promptflow-core==1.18.1", + "promptflow-devkit==1.18.1", + "promptflow-tracing==1.18.1" + ], + "ref": "promptflow==1.18.1" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "aiohttp==3.12.13", + "pydantic==2.12.4", + "pytest==9.0.1" + ], + "ref": "prompts-tools==0.1.0" + }, + { + "ref": "propcache==0.3.2" + }, + { + "dependsOn": [ + "google-api-core==2.29.0", + "protobuf==5.29.6" + ], + "ref": "proto-plus==1.27.1" + }, + { + "ref": "protobuf==5.29.6" + }, + { + "dependsOn": [ + "black==26.3.1", + "colorama==0.4.6", + "coverage==7.13.4", + "packaging==25.0", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "pywin32==311", + "requests==2.32.5", + "ruff==0.15.1", + "setuptools==80.9.0" + ], + "ref": "psutil==7.1.3" + }, + { + "dependsOn": [ + "pytest==9.0.1" + ], + "ref": "pure_eval==0.2.3" + }, + { + "dependsOn": [ + "aiohttp==3.12.13", + "beartype==0.22.6", + "cachetools==6.2.2", + "cryptography==46.0.3", + "diskcache==5.6.3", + "keyring==24.3.1", + "pathvalidate==3.3.1", + "py-key-value-shared==0.2.8", + "pydantic==2.12.4" + ], + "ref": "py-key-value-aio==0.2.8" + }, + { + "dependsOn": [ + "beartype==0.22.6", + "typing_extensions==4.15.0" + ], + "ref": "py-key-value-shared==0.2.8" + }, + { + "dependsOn": [ + "defusedxml==0.7.1" + ], + "ref": "py-serializable==2.1.0" + }, + { + "ref": "pyarrow==23.0.0" + }, + { + "ref": "pyasn1==0.6.1" + }, + { + "dependsOn": [ + "pyasn1==0.6.1" + ], + "ref": "pyasn1_modules==0.4.2" + }, + { + "ref": "pycodestyle==2.14.0" + }, + { + "ref": "pycparser==2.23" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "azure-identity==1.25.1", + "pydantic==2.12.4", + "python-dotenv==1.1.1", + "tomli==2.0.2", + "typing-inspection==0.4.2" + ], + "ref": "pydantic-settings==2.12.0" + }, + { + "dependsOn": [ + "annotated-types==0.7.0", + "email-validator==2.3.0", + "pydantic_core==2.41.5", + "typing-inspection==0.4.2", + "typing_extensions==4.15.0", + "tzdata==2025.2" + ], + "ref": "pydantic==2.12.4" + }, + { + "dependsOn": [ + "typing_extensions==4.15.0" + ], + "ref": "pydantic_core==2.41.5" + }, + { + "dependsOn": [ + "black==26.3.1", + "build==1.4.2", + "coverage==7.13.4", + "flake8==7.3.0", + "mypy==1.19.1", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "typing_extensions==4.15.0" + ], + "ref": "pydash==7.0.7" + }, + { + "ref": "pyflakes==3.4.0" + }, + { + "dependsOn": [ + "Markdown==3.10.2", + "PyYAML==6.0.3", + "Pygments==2.19.2" + ], + "ref": "pymdown-extensions==10.21.2" + }, + { + "dependsOn": [ + "Jinja2==3.1.6" + ], + "ref": "pyparsing==3.2.5" + }, + { + "ref": "pyperclip==1.11.0" + }, + { + "ref": "pyproject_hooks==1.2.0" + }, + { + "dependsOn": [ + "build==1.4.2", + "flake8==7.3.0", + "mypy==1.19.1", + "pytest==9.0.1" + ], + "ref": "pyreadline3==3.5.4" + }, + { + "dependsOn": [ + "coverage==7.13.4", + "pytest==9.0.1", + "typing_extensions==4.15.0" + ], + "ref": "pytest-asyncio==1.3.0" + }, + { + "dependsOn": [ + "coverage==7.13.4", + "pluggy==1.6.0", + "pytest==9.0.1" + ], + "ref": "pytest-cov==7.0.0" + }, + { + "dependsOn": [ + "pytest-asyncio==1.3.0", + "pytest==9.0.1" + ], + "ref": "pytest-mock==3.15.1" + }, + { + "dependsOn": [ + "pytest==9.0.1" + ], + "ref": "pytest-timeout==2.4.0" + }, + { + "dependsOn": [ + "Pygments==2.19.2", + "argcomplete==3.6.3", + "attrs==25.3.0", + "colorama==0.4.6", + "exceptiongroup==1.2.2", + "iniconfig==2.3.0", + "packaging==25.0", + "pluggy==1.6.0", + "requests==2.32.5", + "setuptools==80.9.0", + "tomli==2.0.2" + ], + "ref": "pytest==9.0.1" + }, + { + "dependsOn": [ + "six==1.17.0" + ], + "ref": "python-dateutil==2.9.0.post0" + }, + { + "dependsOn": [ + "lxml==6.0.2", + "typing_extensions==4.15.0" + ], + "ref": "python-docx==1.2.0" + }, + { + "dependsOn": [ + "click==8.1.8" + ], + "ref": "python-dotenv==1.1.1" + }, + { + "ref": "python-multipart==0.0.20" + }, + { + "dependsOn": [ + "black==26.3.1", + "build==1.4.2", + "mypy==1.19.1", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "setuptools==80.9.0" + ], + "ref": "pytokens==0.4.1" + }, + { + "ref": "pytz==2025.2" + }, + { + "ref": "pywin32-ctypes==0.2.3" + }, + { + "ref": "pywin32==311" + }, + { + "dependsOn": [ + "PyYAML==6.0.3" + ], + "ref": "pyyaml_env_tag==1.1" + }, + { + "dependsOn": [ + "cffi==2.0.0" + ], + "ref": "pyzmq==27.1.0" + }, + { + "dependsOn": [ + "attrs==25.3.0", + "rpds-py==0.29.0", + "typing_extensions==4.15.0" + ], + "ref": "referencing==0.36.2" + }, + { + "ref": "regex==2025.11.3" + }, + { + "dependsOn": [ + "charset-normalizer==3.4.2", + "pillow==11.0.0" + ], + "ref": "reportlab==4.4.2" + }, + { + "dependsOn": [ + "Werkzeug==3.1.3", + "black==26.3.1", + "build==1.4.2", + "docutils==0.22.3", + "greenlet==3.2.4", + "pyflakes==3.4.0", + "pytest-cov==7.0.0", + "pytest==9.0.1", + "requests==2.32.5" + ], + "ref": "requests-futures==1.0.2" + }, + { + "dependsOn": [ + "oauthlib==3.3.1", + "requests==2.32.5" + ], + "ref": "requests-oauthlib==2.0.0" + }, + { + "dependsOn": [ + "requests==2.32.5" + ], + "ref": "requests-toolbelt==1.0.0" + }, + { + "dependsOn": [ + "PySocks==1.7.1", + "certifi==2025.6.15", + "chardet==5.2.0", + "charset-normalizer==3.4.2", + "idna==3.10", + "urllib3==2.5.0" + ], + "ref": "requests==2.32.5" + }, + { + "dependsOn": [ + "six==1.17.0" + ], + "ref": "rfc3339-validator==0.1.4" + }, + { + "ref": "rfc3986-validator==0.1.1" + }, + { + "dependsOn": [ + "lark==1.3.1", + "pytest==9.0.1" + ], + "ref": "rfc3987-syntax==1.1.0" + }, + { + "dependsOn": [ + "docutils==0.22.3", + "rich==13.9.4" + ], + "ref": "rich-rst==1.3.2" + }, + { + "dependsOn": [ + "Pygments==2.19.2", + "markdown-it-py==3.0.0", + "typing_extensions==4.15.0" + ], + "ref": "rich==13.9.4" + }, + { + "ref": "rpds-py==0.29.0" + }, + { + "dependsOn": [ + "pyasn1==0.6.1" + ], + "ref": "rsa==4.9.1" + }, + { + "ref": "ruamel.yaml.clib==0.2.14" + }, + { + "dependsOn": [ + "ruamel.yaml.clib==0.2.14" + ], + "ref": "ruamel.yaml==0.18.16" + }, + { + "ref": "ruff==0.15.1" + }, + { + "dependsOn": [ + "huggingface-hub==0.36.0", + "numpy==2.3.3", + "packaging==25.0", + "pytest==9.0.1", + "ruff==0.15.1", + "torch==2.9.1" + ], + "ref": "safetensors==0.7.0" + }, + { + "dependsOn": [ + "colorama==0.4.6", + "coverage==7.13.4", + "flake8==7.3.0" + ], + "ref": "semantic-version==2.10.0" + }, + { + "dependsOn": [ + "PyJWT==2.10.1", + "attrs==25.3.0", + "boltons==21.0.0", + "click-option-group==0.5.9", + "click==8.1.8", + "colorama==0.4.6", + "exceptiongroup==1.2.2", + "glom==25.12.0", + "jsonschema==4.25.1", + "mcp==1.23.3", + "opentelemetry-api==1.37.0", + "opentelemetry-exporter-otlp-proto-http==1.37.0", + "opentelemetry-instrumentation-requests==0.58b0", + "opentelemetry-instrumentation-threading==0.58b0", + "opentelemetry-sdk==1.37.0", + "packaging==25.0", + "peewee==3.19.0", + "pywin32==311", + "requests==2.32.5", + "rich==13.9.4", + "ruamel.yaml.clib==0.2.14", + "ruamel.yaml==0.18.16", + "semantic-version==2.10.0", + "tomli==2.0.2", + "typing_extensions==4.15.0", + "urllib3==2.5.0", + "wcmatch==8.5.2" + ], + "ref": "semgrep==1.155.0" + }, + { + "dependsOn": [ + "build==1.4.2", + "filelock==3.20.0", + "importlib_metadata==8.7.0", + "jaraco.functools==4.3.0", + "more-itertools==10.8.0", + "mypy==1.19.1", + "packaging==25.0", + "pip==26.0.1", + "platformdirs==4.5.0", + "pyproject_hooks==1.2.0", + "pytest-cov==7.0.0", + "pytest-timeout==2.4.0", + "pytest==9.0.1", + "ruff==0.15.1", + "tomli==2.0.2" + ], + "ref": "setuptools==80.9.0" + }, + { + "ref": "shellingham==1.5.4" + }, + { + "ref": "six==1.17.0" + }, + { + "ref": "smmap==5.0.2" + }, + { + "ref": "sniffio==1.3.1" + }, + { + "ref": "sortedcontainers==2.4.0" + }, + { + "ref": "soupsieve==2.8.3" + }, + { + "ref": "sqlite-vec==0.1.6" + }, + { + "dependsOn": [ + "SQLAlchemy==2.0.44", + "aiosqlite==0.22.1", + "anyio==4.11.0", + "fastapi==0.123.4", + "starlette==0.50.0", + "uvicorn==0.38.0" + ], + "ref": "sse-starlette==3.0.3" + }, + { + "dependsOn": [ + "Pygments==2.19.2", + "asttokens==3.0.1", + "executing==2.2.1", + "pure_eval==0.2.3", + "pytest==9.0.1" + ], + "ref": "stack-data==0.6.3" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "PyYAML==6.0.3", + "anyio==4.11.0", + "httpx==0.28.1", + "itsdangerous==2.2.0", + "python-multipart==0.0.20", + "typing_extensions==4.15.0" + ], + "ref": "starlette==0.50.0" + }, + { + "ref": "stem==1.8.2" + }, + { + "ref": "stevedore==5.7.0" + }, + { + "dependsOn": [ + "python-dateutil==2.9.0.post0" + ], + "ref": "strictyaml==1.7.3" + }, + { + "dependsOn": [ + "mpmath==1.3.0", + "pytest==9.0.1" + ], + "ref": "sympy==1.14.0" + }, + { + "dependsOn": [ + "wcwidth==0.2.14" + ], + "ref": "tabulate==0.9.0" + }, + { + "dependsOn": [ + "pytest==9.0.1", + "tornado==6.5.4" + ], + "ref": "tenacity==9.1.2" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "nltk==3.9.2", + "numpy==2.3.3", + "pytest==9.0.1" + ], + "ref": "textblob==0.19.0" + }, + { + "dependsOn": [ + "regex==2025.11.3", + "requests==2.32.5" + ], + "ref": "tiktoken==0.12.0" + }, + { + "dependsOn": [ + "black==26.3.1", + "datasets==4.5.0", + "huggingface-hub==0.36.0", + "numpy==2.3.3", + "pytest-asyncio==1.3.0", + "pytest==9.0.1", + "requests==2.32.5", + "ruff==0.15.1" + ], + "ref": "tokenizers==0.22.1" + }, + { + "ref": "tomli==2.0.2" + }, + { + "dependsOn": [ + "Jinja2==3.1.6", + "PyYAML==6.0.3", + "filelock==3.20.0", + "fsspec==2025.10.0", + "networkx==3.6", + "setuptools==80.9.0", + "sympy==1.14.0", + "typing_extensions==4.15.0" + ], + "ref": "torch==2.9.1" + }, + { + "dependsOn": [ + "huggingface-hub==0.36.0", + "lightning-utilities==0.15.2", + "matplotlib==3.10.7", + "mypy==1.19.1", + "nltk==3.9.2", + "numpy==2.3.3", + "onnxruntime==1.23.2", + "packaging==25.0", + "pandas==2.3.2", + "regex==2025.11.3", + "requests==2.32.5", + "torch==2.9.1", + "tqdm==4.67.1", + "transformers==4.57.3" + ], + "ref": "torchmetrics==1.8.2" + }, + { + "ref": "tornado==6.5.4" + }, + { + "dependsOn": [ + "PySocks==1.7.1", + "requests==2.32.5", + "stem==1.8.2" + ], + "ref": "torrequest==0.1.0" + }, + { + "dependsOn": [ + "colorama==0.4.6", + "pytest-asyncio==1.3.0", + "pytest-cov==7.0.0", + "pytest-timeout==2.4.0", + "pytest==9.0.1", + "requests==2.32.5" + ], + "ref": "tqdm==4.67.1" + }, + { + "dependsOn": [ + "argcomplete==3.6.3", + "mypy==1.19.1", + "pytest-mock==3.15.1", + "pytest==9.0.1" + ], + "ref": "traitlets==5.14.3" + }, + { + "dependsOn": [ + "GitPython==3.1.45", + "Jinja2==3.1.6", + "PyYAML==6.0.3", + "beautifulsoup4==4.14.3", + "datasets==4.5.0", + "dill==0.4.0", + "faiss-cpu==1.13.2", + "fastapi==0.123.4", + "filelock==3.20.0", + "huggingface-hub==0.36.0", + "importlib_metadata==8.7.0", + "nltk==3.9.2", + "numpy==2.3.3", + "onnxruntime==1.23.2", + "openai==1.109.1", + "opentelemetry-api==1.37.0", + "opentelemetry-sdk==1.37.0", + "optuna==4.6.0", + "packaging==25.0", + "pandas==2.3.2", + "pillow==11.0.0", + "protobuf==5.29.6", + "psutil==7.1.3", + "pydantic==2.12.4", + "pytest-asyncio==1.3.0", + "pytest-timeout==2.4.0", + "pytest==9.0.1", + "regex==2025.11.3", + "requests==2.32.5", + "rich==13.9.4", + "ruff==0.15.1", + "safetensors==0.7.0", + "starlette==0.50.0", + "tiktoken==0.12.0", + "tokenizers==0.22.1", + "torch==2.9.1", + "tqdm==4.67.1", + "urllib3==2.5.0", + "uvicorn==0.38.0" + ], + "ref": "transformers==4.57.3" + }, + { + "ref": "trove-classifiers==2026.1.14.14" + }, + { + "dependsOn": [ + "click==8.1.8", + "rich==13.9.4", + "shellingham==1.5.4", + "typing_extensions==4.15.0" + ], + "ref": "typer==0.21.1" + }, + { + "dependsOn": [ + "mypy_extensions==1.1.0", + "typing_extensions==4.15.0" + ], + "ref": "typing-inspect==0.9.0" + }, + { + "dependsOn": [ + "typing_extensions==4.15.0" + ], + "ref": "typing-inspection==0.4.2" + }, + { + "ref": "typing_extensions==4.15.0" + }, + { + "ref": "tzdata==2025.2" + }, + { + "dependsOn": [ + "flake8==7.3.0", + "mypy==1.19.1" + ], + "ref": "uri-template==1.3.0" + }, + { + "ref": "uritemplate==4.2.0" + }, + { + "dependsOn": [ + "PySocks==1.7.1", + "zstandard==0.23.0" + ], + "ref": "urllib3==2.5.0" + }, + { + "ref": "uuid_utils==0.14.0" + }, + { + "ref": "uv==0.11.13" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "click==8.1.8", + "colorama==0.4.6", + "h11==0.16.0", + "httptools==0.7.1", + "python-dotenv==1.1.1", + "typing_extensions==4.15.0", + "watchfiles==1.1.1", + "websockets==15.0.1" + ], + "ref": "uvicorn==0.38.0" + }, + { + "dependsOn": [ + "coverage==7.13.4", + "docutils==0.22.3", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "waitress==3.0.2" + }, + { + "dependsOn": [ + "PyYAML==6.0.3" + ], + "ref": "watchdog==6.0.0" + }, + { + "dependsOn": [ + "anyio==4.11.0" + ], + "ref": "watchfiles==1.1.1" + }, + { + "dependsOn": [ + "bracex==2.6" + ], + "ref": "wcmatch==8.5.2" + }, + { + "ref": "wcwidth==0.2.14" + }, + { + "ref": "webcolors==25.10.0" + }, + { + "ref": "websockets==15.0.1" + }, + { + "ref": "wfastcgi==3.0.0" + }, + { + "dependsOn": [ + "winrt-runtime==3.2.1" + ], + "ref": "winrt-Windows.AI.MachineLearning==3.2.1" + }, + { + "dependsOn": [ + "typing_extensions==4.15.0" + ], + "ref": "winrt-runtime==3.2.1" + }, + { + "ref": "wrapt==1.17.3" + }, + { + "dependsOn": [ + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "xlrd==2.0.2" + }, + { + "ref": "xxhash==3.6.0" + }, + { + "dependsOn": [ + "PyYAML==6.0.3", + "flake8==7.3.0", + "pathspec==1.0.4", + "ruff==0.15.1" + ], + "ref": "yamllint==1.38.0" + }, + { + "dependsOn": [ + "idna==3.10", + "multidict==6.6.2", + "propcache==0.3.2" + ], + "ref": "yarl==1.20.1" + }, + { + "dependsOn": [ + "jaraco.functools==4.3.0", + "more-itertools==10.8.0", + "pytest-cov==7.0.0", + "pytest==9.0.1" + ], + "ref": "zipp==3.23.0" + }, + { + "dependsOn": [ + "cffi==2.0.0" + ], + "ref": "zstandard==0.23.0" + } + ], + "metadata": { + "timestamp": "2026-05-11T22:45:06.795467+00:00", + "tools": { + "components": [ + { + "description": "CycloneDX Software Bill of Materials (SBOM) generator for Python projects and environments", + "externalReferences": [ + { + "type": "build-system", + "url": "https://github.com/CycloneDX/cyclonedx-python/actions" + }, + { + "type": "distribution", + "url": "https://pypi.org/project/cyclonedx-bom/" + }, + { + "type": "documentation", + "url": "https://cyclonedx-bom-tool.readthedocs.io/" + }, + { + "type": "issue-tracker", + "url": "https://github.com/CycloneDX/cyclonedx-python/issues" + }, + { + "type": "license", + "url": "https://github.com/CycloneDX/cyclonedx-python/blob/main/LICENSE" + }, + { + "type": "release-notes", + "url": "https://github.com/CycloneDX/cyclonedx-python/blob/main/CHANGELOG.md" + }, + { + "type": "vcs", + "url": "https://github.com/CycloneDX/cyclonedx-python/" + }, + { + "type": "website", + "url": "https://github.com/CycloneDX/cyclonedx-python/#readme" + } + ], + "group": "CycloneDX", + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "cyclonedx-py", + "type": "application", + "version": "7.3.0" + }, + { + "description": "Python library for CycloneDX", + "externalReferences": [ + { + "type": "build-system", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions" + }, + { + "type": "distribution", + "url": "https://pypi.org/project/cyclonedx-python-lib/" + }, + { + "type": "documentation", + "url": "https://cyclonedx-python-library.readthedocs.io/" + }, + { + "type": "issue-tracker", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues" + }, + { + "type": "license", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE" + }, + { + "type": "release-notes", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md" + }, + { + "type": "vcs", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib" + }, + { + "type": "website", + "url": "https://github.com/CycloneDX/cyclonedx-python-lib/#readme" + } + ], + "group": "CycloneDX", + "licenses": [ + { + "license": { + "acknowledgement": "declared", + "id": "Apache-2.0" + } + } + ], + "name": "cyclonedx-python-lib", + "type": "library", + "version": "11.7.0" + } + ] + } + }, + "serialNumber": "urn:uuid:12b28aad-19b2-41d3-8d18-186f3d1d6a02", + "version": 1, + "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json", + "bomFormat": "CycloneDX", + "specVersion": "1.6" +} \ No newline at end of file