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/.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/.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 570295d..0000000 Binary files a/dev/planning/Repo Name Suggestions.docx and /dev/null differ diff --git a/dev/planning/Repo Name Suggestions.pdf b/dev/planning/Repo Name Suggestions.pdf deleted file mode 100644 index a80949f..0000000 Binary files a/dev/planning/Repo Name Suggestions.pdf and /dev/null differ diff --git a/dev/planning/chatgpt covo.txt b/dev/planning/chatgpt covo.txt deleted file mode 100644 index f97991f..0000000 --- a/dev/planning/chatgpt covo.txt +++ /dev/null @@ -1,1012 +0,0 @@ -Below is a concrete positioning doc shaped around the current market and your build spec. - -The core strategic takeaway is this: broad “agent framework” and “unified provider” positioning is already crowded. LangGraph is positioned as low-level infrastructure for long-running, stateful agent workflows; PydanticAI emphasizes a model-agnostic agent framework with broad provider support and tools; LiteLLM emphasizes unified access, gatewaying, and spend tracking; and the OpenAI Agents SDK emphasizes lightweight agent orchestration primitives. That means your strongest lane is not “another general orchestration framework,” but a narrower one: pattern-first, budget-aware execution for OpenAI-compatible endpoints, with minimal dependencies and a small API surface. - -Your build plan already supports that narrower lane well: it keeps v0.1 centered on three patterns, one composition primitive, one provider abstraction, and shared cost tracking, while explicitly deferring streaming, observability, OpenTelemetry, Anthropic-native support, and docs-site/platform concerns. That is a good boundary and should become part of the product story, not just an internal implementation detail. - -Positioning Doc -1. Positioning statement - -ExecutionKit is a minimal Python library for composable LLM reasoning patterns. -It gives developers a small set of reusable execution primitives — consensus, refine loops, ReAct tool loops, and pattern composition with shared budget tracking — that work across any OpenAI-compatible endpoint using one simple provider class and no SDK dependencies beyond stdlib HTTP/JSON plus the package’s tiny type/runtime footprint. - -2. Market position -What ExecutionKit is -A pattern library, not a full agent platform. -An execution layer, not a gateway or proxy. -A small orchestration helper, not a stateful graph runtime. -A budget-aware composition toolkit, not an observability suite. -A portable OpenAI-compatible client abstraction, not a native adapter matrix for every provider. -What ExecutionKit is not -Not a LangGraph-style framework for durable, long-running, stateful workflows. LangGraph explicitly targets those use cases. -Not a PydanticAI-style full agent framework with broad provider-native support and tool ecosystems. PydanticAI explicitly positions itself as model-agnostic with built-in support for many providers and tool modes. -Not a LiteLLM-style gateway or unified LLM control plane with spend dashboards, budgets, routing, and logging. LiteLLM explicitly positions around unified access, proxying, and spend tracking. -Not an OpenAI Agents SDK-style multi-agent orchestration package. The Agents SDK explicitly centers agents, tools, and orchestration flows. -3. Differentiators -Primary differentiators - -Pattern-first API -The user-facing abstraction is a reasoning pattern, not an agent, graph, router, or workflow engine. That is the cleanest conceptual separation from adjacent tools. - -Shared budget tracking across composition -Budget tracking is part of execution semantics, not just reporting. In your plan, pipe() shares remaining budget across steps and costs merge through PatternResult, which is more specific than generic usage logging. - -OpenAI-compatible by design -The product boundary is deliberate: support any endpoint that speaks OpenAI-style chat completions, rather than taking on every native provider SDK. That makes the abstraction easier to explain and lighter to maintain. - -Zero-SDK philosophy -This is emotionally and practically valuable. In a market full of frameworks, wrappers, SDK layers, gateways, and adapters, “URL + API key + JSON” is a real positioning asset. - -Secondary differentiators - -Portable across cloud and local serving stacks -Because the boundary is OpenAI-compatible HTTP, the same library can target OpenAI, Azure-style endpoints, Ollama, LM Studio, vLLM, and similar servers without changing the core pattern API. That is narrower than “all providers,” but sharper and more honest. LM Studio, Ollama, and vLLM all document OpenAI-compatible serving paths. - -4. Ideal user - -ExecutionKit is for developers who: - -already know how to make a basic LLM call, -do not want a full agent framework, -want a few reusable higher-level reasoning patterns, -care about portability across endpoints, -want to keep cost/budget visible during chained execution, -prefer small abstractions over large ecosystems. -5. Ideal use cases - -Strongest use cases for the homepage and README: - -run multiple samples or models and vote on the best answer, -iteratively refine an answer until it stabilizes, -use tools in a bounded ReAct loop for task completion, -chain these patterns while keeping a shared token/call budget, -swap between hosted and local OpenAI-compatible endpoints with no pattern-level rewrite. -6. Messaging hierarchy -Lead with -composable reasoning patterns -budget-aware execution -OpenAI-compatible portability -minimal dependencies -De-emphasize -“universal provider” -“supports many endpoints” -“agent orchestration” -“framework” -“gateway” -“cost tracking” as a standalone headline - -Those secondary ideas are either crowded or easy to misread as LiteLLM/LangGraph/PydanticAI territory. - -Homepage Draft -Hero - -Composable LLM reasoning patterns. -Consensus, refine loops, and ReAct tool loops with shared budget tracking. - -ExecutionKit is a minimal Python library for running higher-level reasoning patterns over any OpenAI-compatible endpoint. Use one simple provider class, compose patterns with pipe(), and keep token spend visible as execution unfolds. No provider SDK maze. No heavyweight framework. - -Hero subtext - -Works with OpenAI-compatible cloud or local endpoints, including OpenAI, Azure-style endpoints, Ollama, LM Studio, vLLM, and similar servers. Keep the same pattern API while switching endpoints. The library stays small by treating OpenAI-compatible HTTP as the core boundary. - -Hero CTA ideas -Read the quickstart -See the three core patterns -Why not a full agent framework? -Problem section -Most LLM tooling makes one of two tradeoffs - -Either it stays too low-level — simple chat calls with no reusable reasoning patterns — or it becomes a full orchestration framework with graph runtimes, provider adapters, observability layers, and infrastructure concerns. - -ExecutionKit sits in the middle: a small execution layer for a few high-value reasoning patterns. It is not trying to be your gateway, your graph runtime, or your agent platform. - -Value props section -Pattern-first - -Use consensus, refine_loop, and react_loop as first-class execution primitives instead of rebuilding them ad hoc in app code. - -Budget-aware - -Track usage through each pattern and across pipe() composition with a shared budget model. - -Portable - -Run the same code against any OpenAI-compatible endpoint through a single provider abstraction. - -Minimal - -Stdlib HTTP + JSON, a small dependency footprint, and a compact surface area. - -Comparison strip - -Use ExecutionKit when - -a raw chat client is too primitive, -a full agent framework is too much, -portability matters, -budget-aware composition matters, -the team wants a small, understandable abstraction. -Quick example -from executionkit import Provider, consensus - -provider = Provider("http://localhost:11434/v1", model="llama3.2") - -result = await consensus( - provider, - "Classify this support ticket into billing, bug, or access." -) - -print(result.value) -print(result.cost) -print(result.metadata["agreement_ratio"]) - -This example works because the library is built around the OpenAI-compatible chat-completions shape, not a provider SDK-specific abstraction. - -Pattern cards -Consensus - -Sample multiple responses and vote on the strongest answer. - -Refine loop - -Iteratively improve an answer until it converges or hits a stopping condition. - -ReAct loop - -Give the model tools and let it reason step by step within bounded rounds and timeouts. - -Pipe - -Chain patterns together with merged usage and a shared budget boundary. - -Why this exists - -Modern frameworks already cover stateful graphs, agents, tools, and full orchestration. ExecutionKit exists for the narrower case: reusable reasoning patterns without the rest of the framework stack. LangGraph emphasizes stateful orchestration, PydanticAI emphasizes broad agent/provider support, LiteLLM emphasizes gatewaying and spend management, and the OpenAI Agents SDK emphasizes agent orchestration primitives. ExecutionKit is intentionally smaller than all of those. - -Homepage tagline options -Composable reasoning patterns for OpenAI-compatible LLMs -Budget-aware LLM execution without the framework weight -Consensus, refinement, and tool loops — one small library -Pattern-first LLM execution - -Best homepage tagline: -Composable reasoning patterns for OpenAI-compatible LLMs - -README Draft Structure -Top section - -ExecutionKit -Composable LLM reasoning patterns for OpenAI-compatible endpoints. - -ExecutionKit is a minimal Python library for running reusable reasoning patterns — consensus, refine loops, ReAct tool loops, and pattern composition with shared budget tracking — over any OpenAI-compatible endpoint through one simple provider class. It is designed for developers who want more than single-prompt calls, but less than a full agent framework. - -Why ExecutionKit? - -Most libraries in this space optimize for one of three things: - -provider breadth and gatewaying, -agent orchestration and stateful workflows, -observability and platform controls. - -ExecutionKit optimizes for something narrower: - -small reusable reasoning patterns, -budget-aware execution, -portability across OpenAI-compatible endpoints, -minimal abstraction and dependency weight. -What it includes in v0.1 -Provider -consensus() -refine_loop() -react_loop() -pipe() -CostTracker -PatternResult -retry, parallelism, convergence detection, JSON extraction fallback -CLI, examples, README, contribution docs -What it does not try to be -not a gateway or proxy, -not a long-running graph runtime, -not a full agent platform, -not a tracing/telemetry suite, -not a provider-SDK abstraction for every native API. -Installation - -Keep this crisp and honest: - -pip install executionkit -Quickstart - -Lead with consensus, not react_loop, because consensus better communicates the product’s differentiated lane. - -from executionkit import Provider, consensus - -provider = Provider("https://api.openai.com/v1", api_key="sk-...", model="gpt-4o-mini") - -result = await consensus( - provider, - "Classify this support ticket into billing, bug, or access.", - num_samples=5, -) - -print(result.value) -print(result.cost) -print(result.metadata["agreement_ratio"]) - -Then show portability: - -ollama = Provider("http://localhost:11434/v1", model="llama3.2") -lmstudio = Provider("http://localhost:1234/v1", model="local-model") -vllm = Provider("http://localhost:8000/v1", model="meta-llama/Llama-3-8B-Instruct") - -That keeps the portability promise concrete without turning the README into a provider matrix. The OpenAI-compatible server model is the key point. - -Core concepts -Provider - -One simple OpenAI-compatible endpoint abstraction: base URL, model, API key, and JSON payloads. - -PatternResult - -Every pattern returns a value plus usage and metadata. - -TokenUsage / CostTracker - -Budget and usage are part of execution. - -pipe() - -Chain patterns and carry budget forward. - -Patterns -consensus() - -Use when one answer is not enough and agreement matters. - -refine_loop() - -Use when quality improves through iterative critique and revision. - -react_loop() - -Use when the task needs tools and bounded multi-step reasoning. - -When to use ExecutionKit - -Use it when: - -you want reusable reasoning patterns, -you want to switch endpoints without rewriting pattern code, -you need cost/budget visibility across composed calls, -you do not want a full workflow or agent framework. -When not to use ExecutionKit - -Use another tool when: - -you need long-running, durable stateful workflows, -you need a full gateway, spend dashboard, or routing layer, -you need provider-native support for many incompatible APIs, -you need extensive observability and tracing out of the box. LangGraph, LiteLLM, PydanticAI, and the OpenAI Agents SDK already focus more directly on those spaces. -Roadmap - -Keep it tight and explicit. See v0.1/v0.2 boundary below. - -Sharper v0.1 / v0.2 Boundary - -Your current build spec is good, but the boundary can be stated more strategically. - -v0.1 theme - -A tiny, credible core for pattern-first execution - -v0.1 should prove four things: - -pattern-first abstractions are useful, -the OpenAI-compatible provider boundary is practical, -budget-aware composition is valuable, -the library can stay small and understandable. -v0.1 must ship - -These are product-defining and should stay: - -Core patterns -consensus -refine_loop -react_loop -Core composition -pipe() with shared budget semantics -Core transport -single Provider for OpenAI-compatible endpoints -LLMProvider protocol for extension, but not marketed as full provider breadth yet -Core execution semantics -PatternResult -TokenUsage -CostTracker -retry -parallel execution -convergence detection -JSON extraction fallback -clear error hierarchy -Core trust assets -5 examples -tight README -tests and smoke paths -CLI only if it helps onboarding; otherwise it should remain secondary in messaging -v0.1 should not expand into - -These are the distraction zones: - -No platform creep -dashboards -routing/fallback matrices beyond what the provider already enables -tenancy, keys, quotas, governance -observability platform positioning - -That space is already occupied heavily by gateway/platform tools like LiteLLM. - -No framework creep -stateful graphs -memory runtimes -durable execution -resumability -complex multi-agent orchestration - -That space is already occupied by tools like LangGraph and agent-focused SDKs. - -No provider-matrix creep -native Anthropic in core -adapter sprawl -“supports everything” messaging - -PydanticAI and LiteLLM already play harder in broad provider coverage. - -v0.2 theme - -Selective expansion that strengthens the core story - -v0.2 should only add things that reinforce pattern-first execution, not broaden the product into a new category. - -v0.2 candidates to keep - -These fit the story: - -1. Better composition and control -richer pipe() ergonomics -shared policy objects for retries/budgets/stopping -better evaluator hooks -optional pattern presets -2. Better developer trust -lightweight trace objects -progress callbacks -richer metadata per pattern run - -These help developers understand pattern behavior without turning the product into a platform. Your spec already lists TraceEntry and ProgressCallback as deferred items, which fits well here. - -3. Optional transport extensions -StreamingProvider -optional non-core providers via protocol implementations -possibly an OnnxProvider or companion local-runtime adapter later, but not in core -4. One additional pattern, only if it proves the model -add another pattern only if it clearly fits the existing mental model -do not add a grab bag of agent features -v0.2 items to keep deferred unless demand is obvious -OpenTelemetry -docs-site complexity -enterprise observability integrations -broad native provider matrix -graph/state runtime features -multi-agent handoff systems -Recommended one-paragraph product summary - -ExecutionKit is a minimal Python library for composable LLM reasoning patterns. It lets developers run consensus, refine loops, and ReAct tool loops, then chain them with shared budget tracking through a small, predictable API. Instead of becoming a full agent framework or gateway, ExecutionKit stays focused on pattern-first execution over OpenAI-compatible endpoints with a lightweight provider abstraction and minimal dependencies. That makes it a strong fit for teams who want more than raw chat calls, but less than a full orchestration stack. - -Recommended homepage headline and subheadline - -Composable LLM reasoning patterns -Consensus, refinement, and tool loops with shared budget tracking for any OpenAI-compatible endpoint. - -Recommended README opener - -ExecutionKit is a minimal Python library for pattern-first LLM execution. Use consensus(), refine_loop(), react_loop(), and pipe() to run reusable reasoning patterns over any OpenAI-compatible endpoint while keeping token and call usage visible across the whole run. It is designed for developers who want a small execution layer, not a full agent platform. - -The strongest strategic move is to keep the repo and homepage relentlessly centered on patterns + budget-aware composition + OpenAI-compatible portability, because the adjacent lanes for gateways, agent frameworks, and full orchestration are already well occupied. - -If you want, I can turn this into a polished paste-ready README.md and landing-page copy block by block. - -go ahead -Thought for 26s - -Below is a paste-ready package built around the sharper lane that fits both the market and your build spec: pattern-first execution, shared budget tracking, OpenAI-compatible portability, and minimal framework weight. That lane is more defensible because adjacent tools already lean hard into long-running stateful workflows, broad provider-native support, gatewaying, spend controls, and multi-agent orchestration. - -Homepage copy -Composable LLM reasoning patterns - -Consensus, refinement, and tool loops with shared budget tracking for any OpenAI-compatible endpoint. - -ExecutionKit is a minimal Python library for running higher-level reasoning patterns over OpenAI-compatible LLM APIs. Use consensus(), refine_loop(), react_loop(), and pipe() to build reusable execution flows without adopting a heavyweight agent framework. Track token usage and call counts across the full run, not just one request. Works across cloud and local OpenAI-compatible endpoints through one small provider abstraction. - -Why ExecutionKit - -Most LLM tooling goes in one of two directions: either it stays close to raw chat calls, or it expands into a full orchestration stack with state, graphs, routing, tracing, and platform concerns. ExecutionKit takes a narrower path: a small library for reusable reasoning patterns with budget-aware execution. That makes it easier to understand, easier to adopt, and easier to swap across compatible endpoints. - -What you can do -Consensus - -Run multiple samples or models and vote on the strongest answer. - -Refine loop - -Iteratively improve a response until it converges on a quality threshold or hits a stopping condition. - -ReAct loop - -Give the model tools and let it reason step by step within bounded rounds and timeouts. - -Pipe - -Chain patterns together and keep one shared budget across the whole run. - -Why teams use it -Pattern-first - -The core abstraction is a reasoning pattern, not an agent runtime, graph engine, or gateway. - -Budget-aware - -Usage is part of execution semantics. Costs accumulate through each pattern and across composition. - -Portable - -Run the same pattern code against any OpenAI-compatible endpoint through one provider class. That includes hosted APIs and local servers that expose the same interface. - -Minimal - -No provider SDK sprawl. No framework maze. Just stdlib HTTP, JSON, and a compact API surface. - -Quick example -from executionkit import Provider, consensus - -provider = Provider( - "http://localhost:11434/v1", - model="llama3.2", -) - -result = await consensus( - provider, - "Classify this support ticket into billing, bug, or access.", - num_samples=5, -) - -print(result.value) -print(result.cost) -print(result.metadata["agreement_ratio"]) -Works where OpenAI-compatible APIs work - -Use the same pattern API across OpenAI-compatible cloud or local endpoints. The core boundary is simple: if it speaks OpenAI-style chat completions, it fits the default provider model. - -Not another full agent framework - -ExecutionKit is for developers who want more than single-prompt calls but less than a full workflow framework, gateway, or multi-agent platform. It stays focused on a few high-value reasoning patterns and a small execution model. That makes the project intentionally smaller than frameworks built for long-running stateful workflows, broad provider-native support, spend-control gateways, or multi-agent orchestration. - -CTA strip - -Small API. Portable execution. Visible budgets. - -Build with reusable reasoning patterns instead of ad hoc prompt loops. - -README.md draft -ExecutionKit - -Composable LLM reasoning patterns for OpenAI-compatible endpoints. - -ExecutionKit is a minimal Python library for running reusable reasoning patterns over OpenAI-compatible LLM APIs. It gives you a small set of execution primitives: - -consensus() -refine_loop() -react_loop() -pipe() - -Each pattern returns structured output, usage data, and metadata so budget and execution remain visible from the first call to the last. The goal is simple: more power than one-off prompt calls, less weight than a full agent framework. - -Why ExecutionKit - -A lot of LLM tooling is optimized for one of these jobs: - -long-running stateful workflows -broad provider-native support -gateways, spend controls, and observability -multi-agent orchestration - -ExecutionKit is optimized for a narrower job: - -reusable reasoning patterns -shared budget tracking across composition -portability across OpenAI-compatible endpoints -a small, understandable API surface - -That narrower scope is deliberate. It keeps the library useful without turning it into a workflow engine, proxy, or platform. - -Installation -pip install executionkit -Quickstart -from executionkit import Provider, consensus - -provider = Provider( - "https://api.openai.com/v1", - api_key="sk-...", - model="gpt-4o-mini", -) - -result = await consensus( - provider, - "Classify this support ticket into billing, bug, or access.", - num_samples=5, -) - -print(result.value) -print(result.cost) -print(result.metadata["agreement_ratio"]) -Portability - -The same provider shape works across OpenAI-compatible endpoints. - -from executionkit import Provider - -openai = Provider( - "https://api.openai.com/v1", - api_key="sk-...", - model="gpt-4o-mini", -) - -ollama = Provider( - "http://localhost:11434/v1", - model="llama3.2", -) - -lmstudio = Provider( - "http://localhost:1234/v1", - model="local-model", -) - -vllm = Provider( - "http://localhost:8000/v1", - model="meta-llama/Llama-3-8B-Instruct", -) - -ExecutionKit does not try to be a native adapter layer for every model API. Its default path is narrower and simpler: one provider abstraction for OpenAI-compatible chat-completions endpoints. - -Core ideas -Provider - -A small OpenAI-compatible endpoint wrapper built around URL, API key, model, and JSON requests. - -PatternResult - -Each pattern returns: - -value -score -cost -metadata - -This keeps result data and execution data together. - -TokenUsage and CostTracker - -Usage tracking is built into execution, not bolted on afterward. You can track input tokens, output tokens, and LLM call counts across a full run. - -pipe() - -Compose patterns together and carry forward a shared budget boundary. - -Patterns -consensus() - -Use when a single generation is not enough and agreement matters. - -result = await consensus( - provider, - "Summarize the issue and assign a severity.", - num_samples=5, -) - -Returns a PatternResult[str] with metadata such as agreement ratio, unique responses, and tie count. - -refine_loop() - -Use when quality improves through repeated critique and revision. - -result = await refine_loop( - provider, - "Draft a short customer-facing explanation of this outage.", - target_score=0.9, - max_iterations=5, -) - -Uses convergence detection, evaluator scoring, and stopping rules to decide when to stop refining. - -react_loop() - -Use when the task needs tools and bounded step-by-step reasoning. - -result = await react_loop( - provider, - "Find the latest failed deployment and summarize root cause.", - tools=my_tools, - max_rounds=8, -) - -Supports tool schemas, bounded rounds, tool timeouts, and usage tracking throughout the loop. - -pipe() - -Use when you want to chain reasoning patterns into one execution flow. - -result = await pipe( - provider, - "Analyze this incident and prepare a final response.", - consensus, - refine_loop, - max_budget=TokenUsage(input_tokens=20000, output_tokens=8000, llm_calls=20), -) - -pipe() merges usage and passes the remaining budget forward through each step. - -What ships in v0.1 -Patterns -consensus -refine_loop -react_loop -Composition -pipe() -Session -Kit -Provider -one concrete Provider for OpenAI-compatible endpoints -LLMProvider protocol for extension -Engine -retry -parallel execution -convergence detection -JSON extraction fallback -Types -PatternResult[T] -TokenUsage -Tool -ToolCall -VotingStrategy -Evaluator -LLMResponse -Errors -execution, provider, retry, budget, consensus, and iteration failure classes -Infrastructure -CLI -examples -README -contributing docs -tests and verification gates -What does not ship in v0.1 - -These are intentionally deferred: - -tree-of-thought / beam search -native Anthropic provider in core -streaming provider -trace objects and progress callbacks -OpenTelemetry -docs site -platform-style observability or governance features -When to use ExecutionKit - -Use it when: - -raw chat calls are too primitive -you want reusable reasoning patterns -you want to keep budget visible across a run -you want to swap OpenAI-compatible endpoints without rewriting pattern code -you do not want a full graph runtime, gateway, or agent platform -When not to use ExecutionKit - -Reach for another tool when you need: - -long-running durable workflows -memory and resumability -multi-agent handoff systems -spend dashboards, routing, tenancy, or gateway controls -extensive provider-native API coverage out of the box - -Those are important needs, but they belong to broader orchestration frameworks, provider-agnostic agent toolkits, gateways, and agent SDKs that are explicitly designed for them. - -Design principles -Pattern-first - -The product unit is a reasoning pattern, not a framework runtime. - -Budget-aware - -Usage and stopping constraints are first-class. - -OpenAI-compatible - -Portable by design across compatible cloud and local servers. - -Minimal - -Prefer small abstractions and stdlib-friendly implementation choices. - -v0.1 boundary - -v0.1 proves four things: - -pattern-first abstractions are useful -shared budget tracking improves execution discipline -OpenAI-compatible portability is enough for many real workflows -the library can stay small and understandable -v0.2 direction - -v0.2 should deepen the same story rather than expand into a new category. - -Good v0.2 additions: - -richer composition ergonomics -better evaluator hooks -progress callbacks -lightweight trace objects -optional streaming support -optional non-core provider implementations via protocol extension - -Bad v0.2 additions: - -graph runtime complexity -platform observability scope -large provider adapter matrix -governance and gateway positioning -multi-agent system sprawl -Example philosophy - -ExecutionKit is intentionally not trying to replace agent frameworks, gateways, or stateful workflow systems. It fills the space between raw prompt calls and full orchestration stacks. That is the point. - -Contributing - -Keep the scope sharp. Favor features that strengthen: - -composable reasoning patterns -budget-aware execution -OpenAI-compatible portability -small API design - -Be cautious about features that push the project toward: - -workflow engines -control planes -observability platforms -adapter sprawl -full agent ecosystems -License - -MIT - -Sharper v0.1 / v0.2 boundary doc -Product boundary - -ExecutionKit is a minimal execution library for composable LLM reasoning patterns. - -It is not a gateway. -It is not a graph runtime. -It is not a full agent platform. -It is not an observability suite. -It is not a provider SDK umbrella. - -v0.1 -Theme - -A tiny, credible core for pattern-first execution. - -Must ship -consensus -refine_loop -react_loop -pipe() -Provider -LLMProvider -PatternResult -TokenUsage -CostTracker -retry -parallel execution -convergence detection -JSON extraction fallback -tests -examples -README -contribution docs -Product promise - -Developers can run reusable reasoning patterns over any OpenAI-compatible endpoint, compose those patterns together, and keep one shared budget visible across the full run. - -What stays out -native provider sprawl -dashboards -tracing platform features -stateful workflow runtime -multi-agent orchestration -enterprise gateway controls -v0.2 -Theme - -Selective expansion that reinforces the core story. - -Good additions -policy objects for retries and budgets -richer composition helpers -better evaluator plug points -progress callbacks -lightweight trace entries -optional streaming -optional non-core providers via protocol -Avoid -graph-first orchestration -native-everything provider support -control-plane features -governance and dashboard scope -agent ecosystem creep -Recommended one-line tagline options -Composable LLM reasoning patterns for OpenAI-compatible endpoints -Budget-aware LLM execution without framework weight -Consensus, refinement, and tool loops in one small library -Pattern-first LLM execution -Best tagline - -Composable LLM reasoning patterns for OpenAI-compatible endpoints - -Recommended homepage hero - -Composable LLM reasoning patterns -Consensus, refinement, and tool loops with shared budget tracking for any OpenAI-compatible endpoint. - -Recommended README opener - -ExecutionKit is a minimal Python library for pattern-first LLM execution. Use consensus(), refine_loop(), react_loop(), and pipe() to run reusable reasoning patterns over any OpenAI-compatible endpoint while keeping usage visible across the whole run. It is designed for developers who want more than raw chat calls, but less than a full agent framework. - -I can also turn this into a single polished README.md file with badges, section ordering, and tighter examples. - -can you use notion to make a high quality det of initial documentation with an updated spec plan too -there is nothing made in notion yet -any similar alternatives or steps i should take to prep - -I didn’t find any existing Notion pages for this project, so there was nothing for me to update. Instead, I prepared a comprehensive initial documentation and specification plan for ExecutionKit and saved it as a Markdown file. You can download and import it into your Notion workspace: -ExecutionKit v0.1 – Initial Documentation and Updated Specification Plan - -ExecutionKit is a minimal Python library designed for pattern‑first execution over any endpoint that implements the OpenAI‑compatible /chat/completions API. It provides a small set of reusable reasoning patterns with built‑in budget awareness and a lightweight provider abstraction. This document summarises the core concepts of the library, outlines the features that ship in v0.1, notes what is deferred to v0.2, and lays out an updated specification plan to keep the scope tightly focused. - -Key Concepts -Pattern‑First Execution: ExecutionKit packages three high‑level reasoning workflows—consensus, refine_loop, and react_loop—as first‑class functions. Instead of building agents or workflows from scratch, developers can call these patterns to sample from multiple models, iteratively refine answers, or drive a bounded ReAct‑style tool loop. -Budget‑Aware Composition: The library tracks token usage and call counts for each pattern. Using pipe() you can chain patterns together while sharing a TokenUsage budget, so you always know how much input, output, and call quota remains. -OpenAI‑Compatible Transport: A single Provider class wraps HTTP interactions with /chat/completions endpoints. The provider takes a base URL, model name, and optional API key, then sends JSON payloads over the standard interface. This design works seamlessly with OpenAI, Azure, Groq, Together, Ollama, LM Studio and any local or cloud server that advertises OpenAI compatibility. -Minimal Dependencies: ExecutionKit uses only the Python standard library for HTTP and JSON plus Pydantic for type validation. There are no heavy provider SDK dependencies. -What Ships in v0.1 -Patterns: consensus, refine_loop, react_loop -Composition: pipe() helper to chain patterns with a shared budget -Session: Kit for managing pattern execution -Provider: a single universal Provider class (URL + model + API key) -Engine: retry logic, parallel execution helpers, convergence detection, and a JSON extraction fallback for models that return ill‑formed JSON -Types: PatternResult[T], TokenUsage, Tool, ToolCall, VotingStrategy (majority and unanimous), Evaluator, and LLMResponse -Errors: ExecutionKitError hierarchy covering rate limits, provider failures, budget exhaustion, consensus failures and max‑iteration conditions -Features: CostTracker, checked_complete, validate_score, agreement_ratio, was_truncated, and a ConvergenceDetector -Infrastructure: CLI, pyproject.toml, examples, a README and CONTRIBUTING guide -Deferred to v0.2 -Tree‑of‑thought / beam search -Native Anthropic provider and message conversion -TraceEntry and ProgressCallback (observability hooks) -StreamingProvider for real‑time output -OpenTelemetry integration -Dedicated documentation site (mkdocs) -Updated Specification Plan - -The crowded LLM tooling space already includes full agent frameworks, gateways, and orchestration runtimes. ExecutionKit differentiates itself by staying small and opinionated. To preserve that identity: - -v0.1 remains tightly scoped. Only the core patterns (consensus, refine_loop, react_loop), the pipe() composition helper, the Provider abstraction and essential engine utilities ship. There is no graph runtime, multi‑agent handoff, or provider‑specific adapter matrix. Observability and native Anthropic support are explicitly deferred. -v0.2 enhancements focus on composition, not scope creep. The next release should add richer composition ergonomics (policy objects for retries and budgets), optional progress callbacks, lightweight trace objects, streaming support, and optionally separate provider implementations via the LLMProvider protocol. Graph runtimes, dashboards, governance features, and broad provider sprawl remain out of scope. - -By following this plan, ExecutionKit stays a focused execution library rather than an orchestration framework. Its pattern‑first design and budget‑aware composition complement rather than compete with more complex agent platforms. - -Hero Example - -Here is a concise example using consensus with a local model served by Ollama: - -from executionkit import Provider, consensus - -# Connect to a local Ollama server that exposes an OpenAI‑compatible API -provider = Provider("http://localhost:11434/v1", model="llama3.2") - -result = await consensus( - provider, - "Classify this support ticket into billing, bug, or access.", - num_samples=5, -) - -print(result.value) # The chosen classification -print(result.cost) # TokenUsage(input_tokens=250, output_tokens=45, llm_calls=5) -print(result.metadata["agreement_ratio"]) # e.g., 0.8 (4 out of 5 agreed) - -The same code can run against any OpenAI‑compatible endpoint—cloud or local—by changing the provider’s base URL and model name. - -Alternatives to consider - -ExecutionKit focuses on pattern‑first execution with minimal dependencies. If you later decide you need more orchestration features or different abstractions, there are several open‑source frameworks worth evaluating: - -LangGraph extends LangChain into a directed acyclic graph (DAG) architecture. Each node is a step and edges control data flow, making it suitable for stateful workflows where you need precise branching and error handling. -OpenAI Agents SDK packages OpenAI’s capabilities into a structured runtime for multi‑step and multi‑agent tasks. It provides a familiar prompt interface and is deeply integrated with OpenAI models. -Google Agent Development Kit (ADK) offers built‑in multi‑agent orchestration and session management; it’s a good fit if you’re invested in Gemini models or Google’s AI ecosystem. -Smolagents takes a radically simple, code‑centric approach: agents generate and execute Python code in a minimal loop. This is ideal when you want fast setup and lightweight ReAct‑style prompting without complex graphs. -CrewAI focuses on role‑based collaboration. It organizes agents into a “crew,” each with a specialized role, and coordinates their workflow for multi‑agent tasks. -AutoGen (Microsoft Research) frames workflows as asynchronous conversations among agents, which is useful for long-running tasks and dynamic dialogues. -Semantic Kernel is a .NET‑first library designed to orchestrate AI “skills” and traditional code, with an emphasis on enterprise integration and security. -How to prepare -Install ExecutionKit and dependencies: Ensure you have Python 3.10+, install the library via pip install executionkit, and verify Pydantic is installed. -Set up local or cloud models: For local models, run an OpenAI‑compatible server (e.g. Ollama, LM Studio, or vLLM). For cloud, have API keys ready for OpenAI, Groq, Together, or Azure endpoints. The Provider class in ExecutionKit only needs a base URL, model name, and API key. -Define your budget policies: Decide on token budgets and cost limits for your patterns. ExecutionKit lets you enforce budgets via TokenUsage and pipe() so costs don’t exceed your constraints. -Organize documentation: Import the provided Markdown file into Notion or another documentation system. Use it as your “single source of truth,” updating it as the spec evolves. -Evaluate the alternatives: If your needs go beyond pattern‑first execution—such as full graph-based orchestration, multi-agent collaboration, or enterprise integration—compare the frameworks above. LangGraph suits DAG workflows; the OpenAI Agents SDK and Google ADK provide structured runtimes; smolagents and CrewAI offer lightweight approaches. - -Feel free to explore the documentation file and let me know if you need further refinements or additional materials. - -Sources -where is the file - -The documentation is available as a Markdown file created during our previous step. You can download it directly from this link: -ExecutionKit v0.1 – Initial Documentation and Updated Specification Plan - -ExecutionKit is a minimal Python library designed for pattern‑first execution over any endpoint that implements the OpenAI‑compatible /chat/completions API. It provides a small set of reusable reasoning patterns with built‑in budget awareness and a lightweight provider abstraction. This document summarises the core concepts of the library, outlines the features that ship in v0.1, notes what is deferred to v0.2, and lays out an updated specification plan to keep the scope tightly focused. - -Key Concepts -Pattern‑First Execution: ExecutionKit packages three high‑level reasoning workflows—consensus, refine_loop, and react_loop—as first‑class functions. Instead of building agents or workflows from scratch, developers can call these patterns to sample from multiple models, iteratively refine answers, or drive a bounded ReAct‑style tool loop. -Budget‑Aware Composition: The library tracks token usage and call counts for each pattern. Using pipe() you can chain patterns together while sharing a TokenUsage budget, so you always know how much input, output, and call quota remains. -OpenAI‑Compatible Transport: A single Provider class wraps HTTP interactions with /chat/completions endpoints. The provider takes a base URL, model name, and optional API key, then sends JSON payloads over the standard interface. This design works seamlessly with OpenAI, Azure, Groq, Together, Ollama, LM Studio and any local or cloud server that advertises OpenAI compatibility. -Minimal Dependencies: ExecutionKit uses only the Python standard library for HTTP and JSON plus Pydantic for type validation. There are no heavy provider SDK dependencies. -What Ships in v0.1 -Patterns: consensus, refine_loop, react_loop -Composition: pipe() helper to chain patterns with a shared budget -Session: Kit for managing pattern execution -Provider: a single universal Provider class (URL + model + API key) -Engine: retry logic, parallel execution helpers, convergence detection, and a JSON extraction fallback for models that return ill‑formed JSON -Types: PatternResult[T], TokenUsage, Tool, ToolCall, VotingStrategy (majority and unanimous), Evaluator, and LLMResponse -Errors: ExecutionKitError hierarchy covering rate limits, provider failures, budget exhaustion, consensus failures and max‑iteration conditions -Features: CostTracker, checked_complete, validate_score, agreement_ratio, was_truncated, and a ConvergenceDetector -Infrastructure: CLI, pyproject.toml, examples, a README and CONTRIBUTING guide -Deferred to v0.2 -Tree‑of‑thought / beam search -Native Anthropic provider and message conversion -TraceEntry and ProgressCallback (observability hooks) -StreamingProvider for real‑time output -OpenTelemetry integration -Dedicated documentation site (mkdocs) -Updated Specification Plan - -The crowded LLM tooling space already includes full agent frameworks, gateways, and orchestration runtimes. ExecutionKit differentiates itself by staying small and opinionated. To preserve that identity: - -v0.1 remains tightly scoped. Only the core patterns (consensus, refine_loop, react_loop), the pipe() composition helper, the Provider abstraction and essential engine utilities ship. There is no graph runtime, multi‑agent handoff, or provider‑specific adapter matrix. Observability and native Anthropic support are explicitly deferred. -v0.2 enhancements focus on composition, not scope creep. The next release should add richer composition ergonomics (policy objects for retries and budgets), optional progress callbacks, lightweight trace objects, streaming support, and optionally separate provider implementations via the LLMProvider protocol. Graph runtimes, dashboards, governance features, and broad provider sprawl remain out of scope. - -By following this plan, ExecutionKit stays a focused execution library rather than an orchestration framework. Its pattern‑first design and budget‑aware composition complement rather than compete with more complex agent platforms. - -Hero Example - -Here is a concise example using consensus with a local model served by Ollama: - -from executionkit import Provider, consensus - -# Connect to a local Ollama server that exposes an OpenAI‑compatible API -provider = Provider("http://localhost:11434/v1", model="llama3.2") - -result = await consensus( - provider, - "Classify this support ticket into billing, bug, or access.", - num_samples=5, -) - -print(result.value) # The chosen classification -print(result.cost) # TokenUsage(input_tokens=250, output_tokens=45, llm_calls=5) -print(result.metadata["agreement_ratio"]) # e.g., 0.8 (4 out of 5 agreed) - -The same code can run against any OpenAI‑compatible endpoint—cloud or local—by changing the provider’s base URL and model name. \ No newline at end of file diff --git a/dev/planning/convo.txt b/dev/planning/convo.txt deleted file mode 100644 index 33f8d3f..0000000 --- a/dev/planning/convo.txt +++ /dev/null @@ -1,1038 +0,0 @@ -Explore(Explore existing execution patterns in codebase) - ⎿ Backgrounded agent (↓ to manage · ctrl+o to expand) - -● Explore(Market analysis for LLM execution patterns) - ⎿ Backgrounded agent (↓ to manage · ctrl+o to expand) - -● 3 exploration agents deployed in parallel: - - ┌───────────────────┬────────────────────────────┬─────────────────────────────────────────────────────────────────────────────┐ - │ Agent │ Focus │ Investigating │ - ├───────────────────┼────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤ - │ StructureKit │ Product design + │ What would ToT/ReAct/loop primitives look like? What's already built vs │ - │ Evaluator │ competitive positioning │ new? Feature matrix vs LangGraph/DSPy/AutoGen │ - ├───────────────────┼────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤ - │ Pattern Explorer │ Codebase archaeology │ Complete inventory of every execution pattern in the monorepo — DAG, loops, │ - │ │ │ branching, orchestration, tool calling, scoring │ - ├───────────────────┼────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┤ - │ Market Analyst │ Demand signals + gap │ WebSearch for developer demand, competitor gaps, market size for composable │ - │ │ analysis │ LLM reasoning patterns │ - └───────────────────┴────────────────────────────┴─────────────────────────────────────────────────────────────────────────────┘ - - Waiting for all 3 to report back before moving to the Design phase. This will tell us whether the pivot to an "LLM execution - patterns" library has legs, or if it falls into the same traps the antagonistic reviewers identified for Lithom. - -✻ Crunched for 1m 14s · 3 local agents still running - -● Agent "Market analysis for LLM execution patterns" completed - -● Market Analyst is back with strong findings. Key signal: the gap is real — developers - are explicitly requesting ToT/ReAct as first-class primitives in LangChain issues - (#11546, #23181), and 50%+ report LangGraph complexity friction. Agentic AI market - growing 43.8% CAGR. Recommendation: ENTER with "itertools for LLM reasoning" - positioning. - -● Agent "Evaluate StructureKit + execution patterns" completedExplorer. - -● StructureKit Evaluator is back. Strong alignment with Market Analyst — both say - BUILD, both identify the same gap (no library offers ToT + ReAct + loops as - first-class primitives). Key insight: your existing DAG executor is 60% of the way to - ToT — missing pieces are branch generation, scoring, and pruning. - - 1 agent remaining — Pattern Explorer (complete codebase inventory of execution - patterns). Once it's back I'll move to the Design phase and write the plan. -● Agent "Explore existing execution patterns in codebase" completed - -● All 3 exploration agents are back. Here's the convergent picture: - - Convergence across all 3 agents: - - The gap is REAL — no library offers ToT + ReAct + loops as composable primitives - - Your codebase already has 23 production-ready execution patterns (60% of the - foundation) - - The missing pieces are specific: branch scoring/pruning (ToT), consensus voting, - fluent API wrapper - - Market is growing 43.8% CAGR with explicit developer demand signals - -● Plan(Design ExecutionKit implementation plan)nt to synthesize everything into the - ⎿ Backgrounded agent (↓ to manage · ctrl+o to expand) - -● Plan agent launched to design the ExecutionKit implementation. It has: - - All market evidence (demand signals, competitive gaps) - - Complete codebase inventory (23 extractable patterns with file paths and line - numbers) - - Clear scope boundaries (4 core patterns for v0.1, what to defer) - - Competitive positioning against LangGraph, DSPy, AutoGen - - Once it returns, I'll write the final plan to the plan file and present it for -✻ Baked for 1m 2s · 1 local agent still running - -❯ Unknown skill: sidequestion - -● Args from unknown skill: where did you get market developer demand growth from - -❯ Unknown skill: sidetrack - -● Args from unknown skill: where did you get market developer demand growth from - -❯ where did you get market developer demand growth from - -● From the Market Analyst agent's WebSearch results. Here are the specific sources it cited: - - Market size / growth: - - Precedence Research — "Agentic AI Market" report: $5.25B (2024) → $199B (2034), 43.8% CAGR - - Source: precedenceresearch.com/agentic-ai-market - - Markets & Markets — "Agentic AI Market" report: 45% of Fortune 500 actively piloting - - Source: marketsandmarkets.com/Market-Reports/agentic-ai-market-208190735.html - - Developer demand signals (direct GitHub evidence): - - LangChain Issue #11546 — "Add Examples of implementing Tree of Thoughts using Langchain" (open since Oct 2023) - - LangChain Discussion #23181 — "Why langgraph ReAct agent does not have a 'Thought' step?" - - LangChain Issue #34450 — "There is no output of thought content" - - GitHub Community Discussion #182015 — "Is LangChain becoming too complex/bloated?" (50%+ report steep learning curve) - - Framework comparison sources: - - LangWatch blog: "Best AI Agent Frameworks in 2025" - - Akka: "25 LangChain Alternatives" - - IBM Think: "LangChain Alternatives" - - Langfuse: "Comparing Open-Source AI Agent Frameworks" - - Pattern-specific demand: - - Simon Willison's ReAct pattern post (HN discussion) - - Mozilla AI "Star Chamber" (multi-LLM consensus for code quality) - - Self-Refine paper/GitHub (iterative refinement) - - The 43.8% CAGR figure comes from a third-party market research firm (Precedence Research), not from internal data. The developer - demand signals are grounded in real GitHub issues with links. The "50% complexity friction" is from community survey discussions, - not a formal study — so treat that number with some skepticism. - -❯ is it done plannign - -● Not yet — the Plan agent is still running. Let me check its progress. - -● Read(C:\Users\tandf\AppData\Local\Temp\claude\D--source-prompts\2143b6ca-0390-4472-b072-75aa063fcaad\tasks\ac8b0af006c485780.output - ⎿ Read 5 lines - - -● It's still actively exploring the codebase (reading files, running commands). These Plan agents are thorough — it's tracing through - the actual source to validate the design. I'll notify you as soon as it completes. - -● Agent "Design ExecutionKit implementation plan" completed - -● Plan agent is back with the full ExecutionKit design. Let me write the final plan file now. - -● Updated plan - ⎿ Wrote 248 lines to C:\Users\tandf\.claude\plans\linked-twirling-crystal.md - 1 # ExecutionKit: Composable LLM Reasoning Patterns - 2 - 3 ## Context - 4 - 5 The monorepo at `D:/source/prompts` was analyzed by 13+ specialized agents across 4 rounds to identify extractable - 6 1. Native structured outputs from OpenAI/Anthropic/Google make JSON extraction obsolete3 antagonistic reviewers - 7 2. No competitive moat vs LiteLLM + Instructor (11K stars, 3M downloads) - 8 3. 9-provider maintenance is unsustainable (~108 hrs/year) - 9 - 10 The pivot: **ExecutionKit** — "itertools for LLM reasoning." Composable execution patterns (Tree of Thought, ReAct, - 11 nsus, refinement loops) where Python orchestrates real LLM calls. - 12 **Why this wins:** No library owns this space. LangGraph requires graph wiring. DSPy focuses on optimization. Explicit - 13 ub demand signals (LangChain issues #11546, #23181, #34450). Agentic AI market growing 43.8% CAGR. - 14 **Existing codebase provides 60% of the foundation** — 23 production-ready execution patterns already built in - 15 tic-workflows-v2/`. - 16 --- - 17 - 18 ## Package Structure - 19 - 20 ``` - 21 executionkit/ - 22 pyproject.toml - 23 src/executionkit/ - 24 __init__.py # Public: tree_of_thought, react_loop, consensus, refine_loop - 25 provider.py # LLMProvider Protocol + LLMResponse dataclass - 26 types.py # PatternResult[T], Branch, CostMetrics, Tool - 27 cost.py # CostTracker with per-pattern token/cost tracking - 28 patterns/ - 29 __init__.py - 30 tree_of_thought.py # branch -> 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/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 new file mode 100644 index 0000000..8dad804 --- /dev/null +++ b/docs/adr/README.md @@ -0,0 +1,18 @@ +# Architecture Decision Records + +Formal records of significant design decisions made during ExecutionKit's development. +Records follow the [MADR template](https://adr.github.io/madr/). + +## Records + +| 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 + +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/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 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