Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"name": "fxtr",
"source": "./plugins/fxtr",
"description": "Skills for writing, running, and viewing fxtr experiments, and for calling models from them with behaviors",
"version": "0.1.0",
"version": "0.1.1",
"author": {
"name": "TransluceAI"
},
Expand Down
17 changes: 11 additions & 6 deletions .github/scripts/plugin_sanity.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,20 +99,25 @@ def check_docent(plugin_dir: Path) -> None:
fail(f"local credential/config file must not be published: {path}")


FXTR_SKILLS = ["behaviors", "first-experiment", "fxtr"]
SKILLS_WITH_REFERENCES = {"behaviors", "fxtr"}


def check_fxtr(plugin_dir: Path) -> None:
"""The fxtr and behaviors skills, as fxtr3's `pnpm sync:plugin` prepares them: both, from
one clean revision of fxtr3, each with its references and links that resolve."""
"""The behaviors, first-experiment, and fxtr skills, as fxtr3's `pnpm sync:plugin` prepares
them: all from one clean revision of fxtr3, with links that resolve. The behaviors and fxtr
skills each hold a copy of the pages they link; first-experiment links into those copies."""
skills = sorted(path.name for path in (plugin_dir / "skills").iterdir() if path.is_dir())
if skills != ["behaviors", "fxtr"]:
fail(f"fxtr plugin must hold exactly the behaviors and fxtr skills, not {skills}")
if skills != FXTR_SKILLS:
fail(f"fxtr plugin must hold exactly the skills {FXTR_SKILLS}, not {skills}")
revisions = set()
for name in skills:
skill_dir = plugin_dir / "skills" / name
skill_md = skill_dir / "SKILL.md"
if not skill_md.is_file() or not skill_md.read_text(encoding="utf-8").strip():
fail(f"{name} skill needs a non-empty SKILL.md")
references = [p for p in (skill_dir / "references").rglob("*") if p.is_file()]
if not references:
if not references and name in SKILLS_WITH_REFERENCES:
fail(f"{name} skill has no references")
for page in references:
if page.suffix in {".md", ".mdx"} and not page.read_text(encoding="utf-8").strip():
Expand All @@ -135,7 +140,7 @@ def check_fxtr(plugin_dir: Path) -> None:
if not path.is_file():
fail(f"{name}/SKILL.md links to a missing file: {target}")
if len(revisions) != 1:
fail("the fxtr and behaviors skills must be prepared from the same fxtr3 revision")
fail("the fxtr plugin's skills must be prepared from the same fxtr3 revision")


PLUGIN_CHECKS: dict[str, Callable[[Path], None]] = {
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ The docent plugin includes two skills:
- **analysis** - Analyzing agent behavior with Docent
- **ingestion** - Structured workflow for ingesting agent run data into Docent

The fxtr plugin includes two skills, each with a copy of the documentation it links from
The fxtr plugin includes three skills, with a copy of the documentation they link from
[docs.transluce.ai](https://docs.transluce.ai):
- **fxtr** - Setting up, writing, running, and viewing fxtr experiments
- **behaviors** - Calling language models from fxtr experiments with the behaviors library
- **first-experiment** - A guided walkthrough of a first fxtr experiment, from a question to results

## Installation

Expand Down
2 changes: 1 addition & 1 deletion plugins/fxtr/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
"author": {
"name": "TransluceAI"
},
"version": "0.1.0"
"version": "0.1.1"
}
8 changes: 4 additions & 4 deletions plugins/fxtr/skills/behaviors/provenance.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
"skill": "behaviors",
"documentation": "https://docs.transluce.ai/behaviors",
"packages": {
"fxtr": "0.0.1a0",
"behaviors": "0.0.1a0"
"fxtr": "0.0.1a2",
"behaviors": "0.0.1a2"
},
"revision": "8d820d77c1292b4792602cbbe5a9876693de3d99",
"revision": "81bc041101951f16dd70e69340d64e80abd34f01",
"modified": false,
"content_sha256": "1c5471096fa21b00e363ac7f69f33bb54d19ade3998658a937328b980645485b"
"content_sha256": "de0ca958d570464776b006b595d0f26b7be280a6c5baf88c46629d2982757eee"
}
2 changes: 1 addition & 1 deletion plugins/fxtr/skills/behaviors/references/INDEX.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ in the order of the site's navigation.

## Get started

- [Introduction](index.mdx): Primitives for evaluating AI model behavior.
- [What is the behaviors library?](index.mdx): Primitives for evaluating AI model behavior.

## Other pages

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ uv add "behaviors[models]"

Then commit the updated `pyproject.toml` and `uv.lock`.

Set your provider's API key in the environment: `OPENAI_API_KEY` or `ANTHROPIC_API_KEY`. Never
store credentials in experiment inputs or entities.
Set your provider's API key, `OPENAI_API_KEY` or `ANTHROPIC_API_KEY`, in the project's `.env`
(see [Project configuration](../../../fxtr/references/reference/project-configuration.mdx#env)) or in the environment.

| Provider | Adapter |
| ---------------------------------- | ------------------------------------------------------------------------------------ |
Expand Down
2 changes: 1 addition & 1 deletion plugins/fxtr/skills/behaviors/references/index.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "Introduction"
title: "What is the behaviors library?"
description: "Primitives for evaluating AI model behavior."
---

Expand Down
Loading
Loading