From 512574697f99ceae336c68414f1c26636b3d0854 Mon Sep 17 00:00:00 2001 From: Samhita Alla Date: Tue, 11 Aug 2026 15:28:19 +0530 Subject: [PATCH] =?UTF-8?q?fix:=20repo=20review=20cleanup=20=E2=80=94=20CI?= =?UTF-8?q?,=20eval=20harness,=20manifests,=20and=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI (.github/workflows/skill-evals.yml): - quote the flyte pin: unquoted 'flyte>=2.5.0' was a shell redirect that installed unconstrained flyte and wrote pip output to a file named '=2.5.0' - add a harness-tests job so the evals unit tests actually run in CI - trigger the workflow on changes to itself Eval harness: - select.py: map evals/scenarios//** changes to that skill so scenario-only PRs run evals instead of skipping them - evaluate.py: fix the expect_status tautology (X and (Y or X)) that made real_run.expect_status never actually assert - runners/base.py: exclude .hermes and opencode.json from workspace snapshots (.hermes leaked the installed SKILL.md into judge prompts as agent output, inflating treatment scores; opencode.json leaked the GLM API key) - eval_wf.py: surface failed flyte.map elements as errored scorecard rows via a new errored_scenario() helper instead of silently dropping them - test_report.py: rewrite stale pass/fail-era tests against the rating-based report, covering the skipped/errored/regression paths Config: - commit .agents/plugins/marketplace.json — the canonical Codex marketplace path per the OpenAI plugin spec — with a description on the plugin entry - align the plugin descriptions across all four manifests - marketplace description: 'Claude Code skills' -> 'Agent skills' (the repo also targets Codex, Hermes, opencode, and pi) - bump package.json to 0.3.0 to match the plugin manifests - gitignore .venv/, *.egg-info/, *.zip, __MACOSX/ Docs: - READMEs: lead with the plugin being for Claude Code and OpenAI Codex (full plugin incl. MCP servers) plus any Agent Skills harness, and give Codex its own install section — it gets the MCP servers, not just skills - root README: deploy-flyte-kind supports DigitalOcean only (EC2/GCP belong to deploy-flyte-kind-vm); standardize 'Flyte v2' -> 'Flyte 2' - flyte-sdk-types: FlyteFile (a Flyte 1 type) -> flyte.io.File - deploy-flyte-kind description: mention the OIDC auth the skill covers Co-Authored-By: Claude Fable 5 Signed-off-by: Samhita Alla --- .agents/plugins/marketplace.json | 24 ++++++++++++ .claude-plugin/marketplace.json | 4 +- .github/workflows/skill-evals.yml | 14 ++++++- .gitignore | 4 ++ README.md | 12 +++--- evals/harness/evaluate.py | 12 +++++- evals/harness/runners/base.py | 4 +- evals/select.py | 13 +++++-- evals/tests/test_report.py | 39 +++++++++++++++---- evals/tests/test_select.py | 9 +++++ evals/workflows/eval_wf.py | 15 ++++++- package.json | 2 +- plugins/flyte/.claude-plugin/plugin.json | 2 +- plugins/flyte/.codex-plugin/plugin.json | 2 +- plugins/flyte/README.md | 26 ++++++++----- .../flyte/skills/deploy-flyte-kind/SKILL.md | 2 +- plugins/flyte/skills/flyte-sdk-types/SKILL.md | 2 +- 17 files changed, 147 insertions(+), 39 deletions(-) create mode 100644 .agents/plugins/marketplace.json diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json new file mode 100644 index 0000000..f031a4d --- /dev/null +++ b/.agents/plugins/marketplace.json @@ -0,0 +1,24 @@ +{ + "name": "flyte-agent-plugins", + "interface": { + "displayName": "Flyte Agent Plugins" + }, + "plugins": [ + { + "name": "flyte", + "description": "Work with Flyte 2. Deploy Flyte on AWS or kind, author and run workflows, apps, agents, data, and ML workloads with the SDK, and operate your cluster through bundled MCP servers.", + "source": { + "source": "local", + "path": "./plugins/flyte" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_USE" + }, + "category": "Developer Tools", + "interface": { + "displayName": "Flyte" + } + } + ] +} diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index ef4af5c..cb00a88 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -4,12 +4,12 @@ "name": "flyteorg", "url": "https://github.com/flyteorg/flyte-agent-plugins" }, - "description": "Claude Code skills and MCP servers for working with Flyte.", + "description": "Agent skills and MCP servers for working with Flyte.", "plugins": [ { "name": "flyte", "source": "./plugins/flyte", - "description": "Work with Flyte 2 — deploy Flyte v2 (flyte-binary) clusters on AWS or kind, author and run workflows, apps, agents, data, and ML workloads with the SDK, and operate your cluster through bundled MCP servers." + "description": "Work with Flyte 2. Deploy Flyte on AWS or kind, author and run workflows, apps, agents, data, and ML workloads with the SDK, and operate your cluster through bundled MCP servers." } ] } diff --git a/.github/workflows/skill-evals.yml b/.github/workflows/skill-evals.yml index 0aadbb6..53e3ac1 100644 --- a/.github/workflows/skill-evals.yml +++ b/.github/workflows/skill-evals.yml @@ -8,6 +8,7 @@ on: paths: - "plugins/**" - "evals/**" + - ".github/workflows/skill-evals.yml" schedule: - cron: "0 7 * * *" # nightly full matrix (incl. real tier) workflow_dispatch: {} @@ -16,6 +17,17 @@ env: PYTHONPATH: ${{ github.workspace }} jobs: + # 0) Harness unit tests — cheap, no cluster, no secrets. + harness-tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - run: pip install pytest pyyaml requests + - run: python -m pytest evals/tests -q + # 1) Decide what to run from the diff. select: runs-on: ubuntu-latest @@ -61,7 +73,7 @@ jobs: - uses: actions/setup-python@v5 with: python-version: "3.12" - - run: pip install flyte>=2.5.0 pyyaml requests + - run: pip install 'flyte>=2.5.0' pyyaml requests - name: Run evals on demo.hosted env: # The flyte v2 SDK authenticates to demo.hosted via an API key read from diff --git a/.gitignore b/.gitignore index aea4129..53845d7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,7 @@ __pycache__/ .ruff_cache/ .flyte/ .DS_Store +.venv/ +*.egg-info/ +*.zip +__MACOSX/ diff --git a/README.md b/README.md index 0a0b2e6..43b97fc 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # Flyte Agent Plugins -A [Claude Code](https://docs.claude.com/en/docs/claude-code) plugin marketplace for -working with [Flyte](https://flyte.org). +A plugin marketplace for working with [Flyte](https://flyte.org) — in +[Claude Code](https://docs.claude.com/en/docs/claude-code), +[OpenAI Codex](https://developers.openai.com/plugins), or any agent harness that +supports [Agent Skills](https://agentskills.io). Everything ships in a single `flyte` plugin: 14 skills, plus two **MCP servers** that let Claude search Flyte docs and act on your own cluster — see @@ -115,8 +117,8 @@ pi install git:github.com/flyteorg/flyte-agent-plugins@ # pinned to | Skill | Description | |-------|-------------| -| [`flyte-deploy-aws`](plugins/flyte/skills/flyte-deploy-aws) | Deploy a Flyte v2 (`flyte-binary`) cluster on AWS from scratch — EKS + S3 + RDS PostgreSQL + AWS Load Balancer Controller + `helm`, with optional TLS (ACM, incl. cross-account DNS) and Okta/OIDC SSO. | -| [`deploy-flyte-kind`](plugins/flyte/skills/deploy-flyte-kind) | Deploy a Flyte v2 (`flyte-binary`) cluster on `kind` — on your local machine or a cloud VM (DigitalOcean, AWS EC2, or GCP), backed by a hosted PostgreSQL (Supabase/external) and object store (S3/R2), with optional OIDC auth via Traefik + oauth2-proxy. | +| [`flyte-deploy-aws`](plugins/flyte/skills/flyte-deploy-aws) | Deploy a Flyte 2 (`flyte-binary`) cluster on AWS from scratch — EKS + S3 + RDS PostgreSQL + AWS Load Balancer Controller + `helm`, with optional TLS (ACM, incl. cross-account DNS) and Okta/OIDC SSO. | +| [`deploy-flyte-kind`](plugins/flyte/skills/deploy-flyte-kind) | Deploy a Flyte 2 (`flyte-binary`) cluster on `kind` — on your local machine or a DigitalOcean droplet (for AWS EC2 or GCP VMs, see `deploy-flyte-kind-vm`), backed by a hosted PostgreSQL (Supabase/external) and object store (S3/R2), with optional OIDC auth via Traefik + oauth2-proxy. | | [`deploy-flyte-kind-vm`](plugins/flyte/skills/deploy-flyte-kind-vm) | Provision a host (local or a fresh DigitalOcean / AWS EC2 / GCP VM), install the tooling, and run the kind Flyte deploy on it with access tunneled back to your machine. | | [`start-dex-local`](plugins/flyte/skills/start-dex-local) | Deploy Dex as an in-cluster OIDC provider for testing kind-based Flyte auth with no cloud account or real users. | @@ -155,7 +157,7 @@ Example: /plugin install flyte@flyte-agent-plugins ``` -Then ask Claude to "deploy a Flyte v2 cluster on AWS", or invoke a skill directly with +Then ask Claude to "deploy a Flyte 2 cluster on AWS", or invoke a skill directly with `/flyte:flyte-deploy-aws`. ## Bundled MCP servers diff --git a/evals/harness/evaluate.py b/evals/harness/evaluate.py index 2a9bfae..0a4fb4b 100644 --- a/evals/harness/evaluate.py +++ b/evals/harness/evaluate.py @@ -170,6 +170,16 @@ def skipped_scenario(scenario: Scenario, harness: str) -> ScenarioResult: return res +def errored_scenario(scenario: Scenario, harness: str | None, error: str) -> ScenarioResult: + """A ScenarioResult marked errored because the eval action died before + returning a verdict (e.g. a failed `flyte.map` element), so the scenario + stays on the scorecard instead of silently vanishing.""" + res = ScenarioResult(scenario.id, scenario.skill, scenario.tier, harness=harness) + for arm in scenario.arms(): + res.arms[arm] = ArmResult(arm=arm, error=error) + return res + + def evaluate_static(scenario: Scenario) -> ScenarioResult: skill_dir = REPO_ROOT / "plugins" / "flyte" / "skills" / scenario.skill results = lint_skill(skill_dir) @@ -235,7 +245,7 @@ def _maybe_real_run(scenario: Scenario, sandbox) -> "checks_mod.CheckResult": except (subprocess.TimeoutExpired, FileNotFoundError) as e: return checks_mod.CheckResult("real_run", False, f"flyte run failed to start: {e}") out = proc.stdout + proc.stderr - ok = proc.returncode == 0 and (spec.expect_status.upper() in out.upper() or proc.returncode == 0) + ok = proc.returncode == 0 and spec.expect_status.upper() in out.upper() tail = " / ".join(out.strip().splitlines()[-3:]) return checks_mod.CheckResult("real_run", ok, f"exit {proc.returncode} :: {tail}") diff --git a/evals/harness/runners/base.py b/evals/harness/runners/base.py index 91b9c13..50bedb3 100644 --- a/evals/harness/runners/base.py +++ b/evals/harness/runners/base.py @@ -18,7 +18,9 @@ from ..spec import Scenario # Files we never treat as "agent-produced artifacts" when snapshotting a workspace. -_IGNORE = {".stublog", ".opencode", ".pi", ".git"} +# `.hermes` holds the installed skill (would leak SKILL.md into the judge prompt as +# agent output); `opencode.json` holds the GLM API key. +_IGNORE = {".stublog", ".opencode", ".pi", ".hermes", ".git", "opencode.json"} @dataclass diff --git a/evals/select.py b/evals/select.py index 77008ee..5911e8c 100644 --- a/evals/select.py +++ b/evals/select.py @@ -1,7 +1,8 @@ """Map changed files -> the subset of scenarios to run. Used by CI to run only what a PR affects: - - a changed `plugins/flyte/skills//**` -> that skill's scenarios + - a changed `plugins/flyte/skills//**` or `evals/scenarios//**` + -> that skill's scenarios - a change to engine/shared-infra paths (manifest.shared_infra_globs) -> run ALL - flags whether the kind DinD smoke and the real tier are in scope @@ -27,6 +28,12 @@ from evals.harness.spec import Manifest, load_scenarios, scenarios_by_skill SKILL_PATH_RE = re.compile(r"plugins/flyte/skills/([^/]+)/") +SCENARIO_PATH_RE = re.compile(r"evals/scenarios/([^/]+)/") + + +def _skill_for(path: str) -> str | None: + m = SKILL_PATH_RE.search(path) or SCENARIO_PATH_RE.search(path) + return m.group(1) if m else None def changed_from_git(base: str, repo_root: pathlib.Path) -> list[str]: @@ -54,9 +61,7 @@ def select(changed: list[str], manifest: Manifest, scenarios, force_all: bool = if run_all: chosen_skills = sorted(by_skill) else: - chosen_skills = sorted({ - m.group(1) for p in changed if (m := SKILL_PATH_RE.search(p)) - }) + chosen_skills = sorted({s for p in changed if (s := _skill_for(p))}) chosen = [sc for sk in chosen_skills for sc in by_skill.get(sk, [])] scenario_ids = sorted(sc.id for sc in chosen) diff --git a/evals/tests/test_report.py b/evals/tests/test_report.py index 7b49594..17e382e 100644 --- a/evals/tests/test_report.py +++ b/evals/tests/test_report.py @@ -1,23 +1,46 @@ -from evals.report import to_html, to_markdown +from evals.report import rating, to_html, to_markdown RESULTS = [ {"scenario_id": "a", "skill": "flyte-sdk-author", "tier": "trajectory", - "harness": "opencode", "passed": True, "lift": 0.4, - "arms": {"treatment": {"score": 0.9, "checks": []}, "control": {"score": 0.5, "checks": []}}}, + "harness": "opencode", "status": "scored", "passed": True, "score": 0.9, + "lift": 0.4, "is_regression": False, + "arms": {"treatment": {"score": 0.9, "checks": []}, + "control": {"score": 0.5, "checks": []}}}, {"scenario_id": "b", "skill": "deploy-flyte-kind", "tier": "static", - "harness": None, "passed": False, "lift": None, + "harness": None, "status": "scored", "passed": False, "score": 0.0, + "lift": None, "is_regression": True, "arms": {"treatment": {"score": 0.0, "error": "boom", "checks": [{"kind": "frontmatter", "passed": False, "detail": "bad"}]}}}, + {"scenario_id": "c", "skill": "flyte-sdk-run", "tier": "trajectory", + "harness": "pi", "status": "skipped", "passed": False, "score": None, + "lift": None, "is_regression": False, + "arms": {"treatment": {"unavailable": True, "error": "pi CLI not available", + "checks": []}}}, + {"scenario_id": "d", "skill": "flyte-sdk-run", "tier": "trajectory", + "harness": "opencode", "status": "error", "passed": False, "score": None, + "lift": None, "is_regression": False, + "arms": {"treatment": {"error": "harness crashed", "checks": []}}}, ] -def test_markdown_has_summary_and_failure_detail(): +def test_rating_aggregates(): + m = rating(RESULTS) + assert m["total"] == 4 and m["scored"] == 2 + assert m["skipped"] == 1 and m["errored"] == 1 + assert m["regressions"] == 1 + assert m["rating"] == 0.45 # mean treatment score over the 2 scored rows + assert m["mean_lift"] == 0.4 + + +def test_markdown_has_rating_glyphs_and_failure_detail(): md = to_markdown(RESULTS) - assert "1/2 passing" in md + assert "2 scored, 1 skipped, 1 errored, 1 regressions" in md assert "flyte-sdk-author" in md and "+0.40" in md - assert "frontmatter" in md and "boom" in md + assert "✅" in md and "❌" in md and "⏭" in md and "⚠" in md + assert "frontmatter" in md and "bad" in md and "harness crashed" in md def test_html_renders(): html = to_html(RESULTS) - assert "" in html and "flyte-sdk-author" in html and "1/2 passing" in html + assert "
" in html and "flyte-sdk-author" in html + assert "rating 0.450" in html diff --git a/evals/tests/test_select.py b/evals/tests/test_select.py index 435fd12..11750b9 100644 --- a/evals/tests/test_select.py +++ b/evals/tests/test_select.py @@ -34,6 +34,15 @@ def test_kind_skill_sets_run_kind(): assert out2["run_kind"] is False +def test_scenario_change_selects_that_skill(): + m = _manifest() + scs = load_scenarios() + out = select(["evals/scenarios/flyte-sdk-author/static.yaml"], m, scs) + assert out["run_all"] is False + assert out["skills"] == ["flyte-sdk-author"] + assert "flyte-sdk-author-static" in out["scenario_ids"] + + def test_unrelated_change_selects_nothing(): m = _manifest() scs = load_scenarios() diff --git a/evals/workflows/eval_wf.py b/evals/workflows/eval_wf.py index 178019b..b8f6392 100644 --- a/evals/workflows/eval_wf.py +++ b/evals/workflows/eval_wf.py @@ -88,7 +88,7 @@ def main(skills: list[str] | None = None, harnesses: list[str] | None = None, tiers: list[str] | None = None) -> dict: """Top-level workflow: build the matrix, fan out, aggregate.""" - from evals.harness.evaluate import skipped_scenario + from evals.harness.evaluate import errored_scenario, skipped_scenario from evals.harness.runners import get_runner from evals.harness.spec import load_scenarios @@ -124,7 +124,18 @@ def _available(h: str) -> bool: return {"total": 0, "scored": 0, "skipped": 0, "errored": 0, "regressions": 0, "rating": None, "results": [], "markdown": "no units selected"} - results = [r for r in flyte.map(eval_unit, units) if isinstance(r, dict)] if units else [] + # A failed map element comes back as a non-dict; keep it on the scorecard as + # an errored result instead of silently dropping the scenario. + results = [] + for u, r in zip(units, flyte.map(eval_unit, units) if units else []): + if isinstance(r, dict): + results.append(r) + else: + print(f"ERROR {u['scenario_id']} [{u.get('harness') or '-'}]: " + f"eval action failed: {r!r}", flush=True) + results.append(errored_scenario( + by_id[u["scenario_id"]], u.get("harness"), + f"eval action failed: {r!r}").to_dict()) # Add skipped harnesses as synthetic results (no task spent) for visibility. results += [skipped_scenario(by_id[u["scenario_id"]], u["harness"]).to_dict() for u in skipped] diff --git a/package.json b/package.json index 03b1639..08aebf9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flyte", - "version": "0.0.5", + "version": "0.3.0", "description": "Agent skills for working with Flyte.", "license": "Apache-2.0", "keywords": ["pi-package"], diff --git a/plugins/flyte/.claude-plugin/plugin.json b/plugins/flyte/.claude-plugin/plugin.json index 909a287..f7ff68f 100644 --- a/plugins/flyte/.claude-plugin/plugin.json +++ b/plugins/flyte/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "flyte", - "description": "Work with Flyte 2 — deploy Flyte v2 (flyte-binary) clusters on AWS or kind, author and run workflows, apps, agents, data, and ML workloads with the SDK, and operate your cluster through bundled MCP servers.", + "description": "Work with Flyte 2. Deploy Flyte on AWS or kind, author and run workflows, apps, agents, data, and ML workloads with the SDK, and operate your cluster through bundled MCP servers.", "version": "0.3.0", "author": { "name": "flyteorg" diff --git a/plugins/flyte/.codex-plugin/plugin.json b/plugins/flyte/.codex-plugin/plugin.json index fbead61..2250c42 100644 --- a/plugins/flyte/.codex-plugin/plugin.json +++ b/plugins/flyte/.codex-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "flyte", "version": "0.3.0", - "description": "Skills for working with Flyte 2 — deploy Flyte v2 (flyte-binary) clusters on AWS or kind, and author, run, and operate Flyte workflows, apps, agents, data, and ML workloads with the SDK.", + "description": "Work with Flyte 2. Deploy Flyte on AWS or kind, author and run workflows, apps, agents, data, and ML workloads with the SDK, and operate your cluster through bundled MCP servers.", "skills": "./skills/", "mcpServers": "./.mcp.json" } diff --git a/plugins/flyte/README.md b/plugins/flyte/README.md index 4b4e1cb..c870f4f 100644 --- a/plugins/flyte/README.md +++ b/plugins/flyte/README.md @@ -1,14 +1,17 @@ # flyte -A single [Claude Code](https://docs.claude.com/en/docs/claude-code) plugin for -[Flyte](https://flyte.org): cluster deployment and SDK / workflow authoring skills, plus -two bundled MCP servers. +A single plugin for [Flyte](https://flyte.org): cluster deployment and SDK / workflow +authoring skills, plus two bundled MCP servers. +[Claude Code](https://docs.claude.com/en/docs/claude-code) and +[OpenAI Codex](https://developers.openai.com/plugins) install it as a full plugin — skills +**and** MCP servers — and any harness that supports +[Agent Skills](https://agentskills.io) (Hermes, opencode, pi) can install the skills. ## Skills ### Deployment -- **`flyte-deploy-aws`** — deploy a Flyte v2 (`flyte-binary`) cluster on AWS from scratch: +- **`flyte-deploy-aws`** — deploy a Flyte 2 (`flyte-binary`) cluster on AWS from scratch: EKS + S3 + RDS PostgreSQL + AWS Load Balancer Controller + `helm`, with optional TLS (ACM, incl. cross-account DNS) and Okta/OIDC SSO. - **`deploy-flyte-kind`** — deploy a complete Flyte stack on a [kind](https://kind.sigs.k8s.io/) @@ -133,7 +136,7 @@ flyte-sdk repo, which stay current as the SDK changes. /plugin install flyte@flyte-agent-plugins ``` -Then ask Claude to, e.g., "deploy a Flyte v2 cluster on AWS", "deploy Flyte on kind", or +Then ask Claude to, e.g., "deploy a Flyte 2 cluster on AWS", "deploy Flyte on kind", or "scaffold a Flyte workflow" — or invoke a skill directly, e.g. `/flyte:flyte-deploy-aws`. @@ -148,17 +151,20 @@ and append `#` — a tag or branch name (not a bare commit SHA; tag the com (To change the pinned version later, `/plugin marketplace remove flyte-agent-plugins` and re-add with the new ref.) -## Install (other agent harnesses) +## Install (OpenAI Codex) -The skills are standard [Agent Skills](https://agentskills.io) (`SKILL.md`), so they also -work with: - -**OpenAI Codex CLI** — add the repo as a plugin marketplace, then install via `/plugins`: +Add the repo as a plugin marketplace, then install via `/plugins` — the skills and both +MCP servers come with it: ``` codex plugin marketplace add flyteorg/flyte-agent-plugins # or --ref to pin ``` +## Install (other agent harnesses) + +The skills are standard [Agent Skills](https://agentskills.io) (`SKILL.md`), so they also +work with: + **Hermes** — install individual skills by repo path (default branch only): ``` diff --git a/plugins/flyte/skills/deploy-flyte-kind/SKILL.md b/plugins/flyte/skills/deploy-flyte-kind/SKILL.md index 033335a..c0a2ea3 100644 --- a/plugins/flyte/skills/deploy-flyte-kind/SKILL.md +++ b/plugins/flyte/skills/deploy-flyte-kind/SKILL.md @@ -1,6 +1,6 @@ --- name: deploy-flyte-kind -description: Deploy a complete Flyte stack (flyte-binary + a hosted PostgreSQL + an object store) onto a kind cluster, running on the user's own machine or a DigitalOcean VM (droplet). PostgreSQL is hosted (Supabase or external); the object store is AWS S3 or Cloudflare R2. Use when the user wants to run Flyte on kind — either reusing an existing kind cluster or creating a new one. For evaluation only (no TLS/auth on the base deployment). +description: Deploy a complete Flyte stack (flyte-binary + a hosted PostgreSQL + an object store) onto a kind cluster, running on the user's own machine or a DigitalOcean VM (droplet). PostgreSQL is hosted (Supabase or external); the object store is AWS S3 or Cloudflare R2. Use when the user wants to run Flyte on kind — either reusing an existing kind cluster or creating a new one. For evaluation only (no TLS/auth on the base deployment; optional OIDC auth via Traefik + oauth2-proxy is covered). --- # Deploy Flyte to a kind cluster diff --git a/plugins/flyte/skills/flyte-sdk-types/SKILL.md b/plugins/flyte/skills/flyte-sdk-types/SKILL.md index dd935cf..87a439f 100644 --- a/plugins/flyte/skills/flyte-sdk-types/SKILL.md +++ b/plugins/flyte/skills/flyte-sdk-types/SKILL.md @@ -400,4 +400,4 @@ Default threshold is generous. For ML training outputs or large DataFrames, set 2. **Passing `flyte.io.File` as a string** — always use `flyte.io.File(path=...)` objects. The path string alone won't serialize. 3. **Using Pandas instead of Polars** — Flyte 2's native DataFrame is Polars. Use `df.to_polars()` to get the underlying DataFrame. 4. **Not registering custom transformers** — if you register a custom type transformer, it must be registered before task execution. -5. **Forgetting `.path` on flyte.io.File** — inside a task, `file` is a FlyteFile object, not a string. Use `file.path` for the local path. +5. **Forgetting `.path` on flyte.io.File** — inside a task, `file` is a `flyte.io.File` object, not a string. Use `file.path` for the local path.