chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
name: Deploy docs
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- "docs/**"
|
||||
- "mkdocs.yml"
|
||||
|
||||
permissions:
|
||||
contents: write # This allows pushing to gh-pages
|
||||
|
||||
jobs:
|
||||
deploy_docs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
- name: Determine docs-only push
|
||||
id: docs-only
|
||||
run: |
|
||||
if [ "${{ github.event_name }}" != "push" ]; then
|
||||
echo "skip=false" >> "$GITHUB_OUTPUT"
|
||||
exit 0
|
||||
fi
|
||||
set -euo pipefail
|
||||
before="${{ github.event.before }}"
|
||||
sha="${{ github.sha }}"
|
||||
changed_files=$(git diff --name-only "$before" "$sha" || true)
|
||||
non_docs=$(echo "$changed_files" | grep -vE '^(docs/|mkdocs.yml$)' || true)
|
||||
if [ -n "$non_docs" ]; then
|
||||
echo "skip=true" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "skip=false" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
- name: Setup uv
|
||||
if: steps.docs-only.outputs.skip != 'true'
|
||||
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # setup-uv v8.1.0; uv 0.11.14
|
||||
with:
|
||||
version: "0.11.14"
|
||||
enable-cache: true
|
||||
- name: Install dependencies
|
||||
if: steps.docs-only.outputs.skip != 'true'
|
||||
run: make sync
|
||||
- name: Deploy docs
|
||||
if: steps.docs-only.outputs.skip != 'true'
|
||||
run: make deploy-docs
|
||||
@@ -0,0 +1,28 @@
|
||||
name: Close inactive issues
|
||||
on:
|
||||
schedule:
|
||||
- cron: "30 1 * * *"
|
||||
|
||||
jobs:
|
||||
close-issues:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899
|
||||
with:
|
||||
days-before-issue-stale: 7
|
||||
days-before-issue-close: 3
|
||||
stale-issue-label: "stale"
|
||||
exempt-issue-labels: "skip-stale"
|
||||
stale-issue-message: "This issue is stale because it has been open for 7 days with no activity."
|
||||
close-issue-message: "This issue was closed because it has been inactive for 3 days since being marked as stale."
|
||||
any-of-issue-labels: 'question,needs-more-info'
|
||||
days-before-pr-stale: 10
|
||||
days-before-pr-close: 7
|
||||
stale-pr-label: "stale"
|
||||
exempt-pr-labels: "skip-stale"
|
||||
stale-pr-message: "This PR is stale because it has been open for 10 days with no activity."
|
||||
close-pr-message: "This PR was closed because it has been inactive for 7 days since being marked as stale."
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -0,0 +1,35 @@
|
||||
name: Publish to PyPI
|
||||
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- published
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
environment:
|
||||
name: pypi
|
||||
url: https://pypi.org/p/openai-agents
|
||||
permissions:
|
||||
id-token: write # Important for trusted publishing to PyPI
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
OPENAI_API_KEY: fake-for-tests
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # setup-uv v8.1.0; uv 0.11.14
|
||||
with:
|
||||
version: "0.11.14"
|
||||
enable-cache: true
|
||||
- name: Install dependencies
|
||||
run: make sync
|
||||
- name: Build package
|
||||
run: uv build
|
||||
- name: Publish to PyPI
|
||||
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b
|
||||
@@ -0,0 +1,143 @@
|
||||
name: Create release PR
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: "Version to release (e.g., 0.6.6)"
|
||||
required: true
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
release-pr:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: main
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # setup-uv v8.1.0; uv 0.11.14
|
||||
with:
|
||||
version: "0.11.14"
|
||||
enable-cache: true
|
||||
- name: Fetch tags
|
||||
run: git fetch origin --tags --prune
|
||||
- name: Ensure release branch does not exist
|
||||
env:
|
||||
RELEASE_VERSION: ${{ inputs.version }}
|
||||
run: |
|
||||
branch="release/v${RELEASE_VERSION}"
|
||||
if git ls-remote --exit-code --heads origin "$branch" >/dev/null 2>&1; then
|
||||
echo "Branch $branch already exists on origin." >&2
|
||||
exit 1
|
||||
fi
|
||||
- name: Update version
|
||||
env:
|
||||
RELEASE_VERSION: ${{ inputs.version }}
|
||||
run: |
|
||||
python - <<'PY'
|
||||
import os
|
||||
import pathlib
|
||||
import re
|
||||
import sys
|
||||
|
||||
version = os.environ["RELEASE_VERSION"]
|
||||
if version.startswith("v"):
|
||||
print("Version must not start with 'v' (use x.y.z...).", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
if ".." in version:
|
||||
print("Version contains consecutive dots (use x.y.z...).", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
if not re.match(r"^\d+\.\d+(\.\d+)*([a-zA-Z0-9\.-]+)?$", version):
|
||||
print(
|
||||
"Version must be semver-like (e.g., 0.6.6, 0.6.6-rc1, 0.6.6.dev1).",
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(1)
|
||||
path = pathlib.Path("pyproject.toml")
|
||||
text = path.read_text()
|
||||
updated, count = re.subn(
|
||||
r'(?m)^version\s*=\s*"[^\"]+"',
|
||||
f'version = "{version}"',
|
||||
text,
|
||||
)
|
||||
if count != 1:
|
||||
print("Expected to update exactly one version line.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
if updated == text:
|
||||
print("Version already set; no changes made.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
path.write_text(updated)
|
||||
PY
|
||||
- name: Sync dependencies
|
||||
run: make sync
|
||||
- name: Configure git
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
- name: Create release branch and commit
|
||||
env:
|
||||
RELEASE_VERSION: ${{ inputs.version }}
|
||||
run: |
|
||||
branch="release/v${RELEASE_VERSION}"
|
||||
git checkout -b "$branch"
|
||||
git add pyproject.toml uv.lock
|
||||
if git diff --cached --quiet; then
|
||||
echo "No changes to commit." >&2
|
||||
exit 1
|
||||
fi
|
||||
git commit -m "Bump version to ${RELEASE_VERSION}"
|
||||
git push --set-upstream origin "$branch"
|
||||
- name: Build PR body
|
||||
env:
|
||||
RELEASE_VERSION: ${{ inputs.version }}
|
||||
run: |
|
||||
printf 'Release PR for %s.\n\nThe release readiness report will be prepared manually.\n' "$RELEASE_VERSION" > pr-body.md
|
||||
- name: Create or update PR
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
RELEASE_VERSION: ${{ inputs.version }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
head_branch="release/v${RELEASE_VERSION}"
|
||||
milestone_name="$(python .github/scripts/select-release-milestone.py --version "$RELEASE_VERSION")"
|
||||
pr_number="$(gh pr list --head "$head_branch" --base "main" --json number --jq '.[0].number // empty')"
|
||||
if [ -z "$pr_number" ]; then
|
||||
create_args=(
|
||||
--title "Release ${RELEASE_VERSION}"
|
||||
--body-file pr-body.md
|
||||
--base "main"
|
||||
--head "$head_branch"
|
||||
--label "project"
|
||||
)
|
||||
if [ -n "$milestone_name" ]; then
|
||||
create_args+=(--milestone "$milestone_name")
|
||||
fi
|
||||
if ! gh pr create "${create_args[@]}"; then
|
||||
echo "PR create with label/milestone failed; retrying without them." >&2
|
||||
gh pr create \
|
||||
--title "Release ${RELEASE_VERSION}" \
|
||||
--body-file pr-body.md \
|
||||
--base "main" \
|
||||
--head "$head_branch"
|
||||
fi
|
||||
else
|
||||
edit_args=(
|
||||
--title "Release ${RELEASE_VERSION}"
|
||||
--body-file pr-body.md
|
||||
--add-label "project"
|
||||
)
|
||||
if [ -n "$milestone_name" ]; then
|
||||
edit_args+=(--milestone "$milestone_name")
|
||||
fi
|
||||
if ! gh pr edit "$pr_number" "${edit_args[@]}"; then
|
||||
echo "PR edit with label/milestone failed; retrying without them." >&2
|
||||
gh pr edit "$pr_number" --title "Release ${RELEASE_VERSION}" --body-file pr-body.md
|
||||
fi
|
||||
fi
|
||||
@@ -0,0 +1,84 @@
|
||||
name: Tag release on merge
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- closed
|
||||
branches:
|
||||
- main
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
tag-release:
|
||||
if: >-
|
||||
github.event.pull_request.merged == true &&
|
||||
github.event.pull_request.head.repo.full_name == github.repository &&
|
||||
startsWith(github.event.pull_request.head.ref, 'release/v')
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Validate merge commit
|
||||
env:
|
||||
MERGE_SHA: ${{ github.event.pull_request.merge_commit_sha }}
|
||||
run: |
|
||||
if [ -z "$MERGE_SHA" ]; then
|
||||
echo "merge_commit_sha is empty; refusing to tag to avoid tagging the wrong commit." >&2
|
||||
exit 1
|
||||
fi
|
||||
- name: Checkout merge commit
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ github.event.pull_request.merge_commit_sha }}
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
|
||||
with:
|
||||
python-version: "3.11"
|
||||
- name: Configure git
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
- name: Fetch tags
|
||||
run: git fetch origin --tags --prune
|
||||
- name: Resolve version
|
||||
id: version
|
||||
env:
|
||||
HEAD_REF: ${{ github.event.pull_request.head.ref }}
|
||||
run: |
|
||||
python - <<'PY'
|
||||
import os
|
||||
import pathlib
|
||||
import sys
|
||||
import tomllib
|
||||
|
||||
path = pathlib.Path("pyproject.toml")
|
||||
data = tomllib.loads(path.read_text())
|
||||
version = data.get("project", {}).get("version")
|
||||
if not version:
|
||||
print("Missing project.version in pyproject.toml.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
head_ref = os.environ.get("HEAD_REF", "")
|
||||
if head_ref.startswith("release/v"):
|
||||
expected = head_ref[len("release/v") :]
|
||||
if expected != version:
|
||||
print(
|
||||
f"Version mismatch: branch {expected} vs pyproject {version}.",
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
output_path = pathlib.Path(os.environ["GITHUB_OUTPUT"])
|
||||
output_path.write_text(f"version={version}\n")
|
||||
PY
|
||||
- name: Create tag
|
||||
env:
|
||||
VERSION: ${{ steps.version.outputs.version }}
|
||||
run: |
|
||||
if git tag -l "v${VERSION}" | grep -q "v${VERSION}"; then
|
||||
echo "Tag v${VERSION} already exists; skipping."
|
||||
exit 0
|
||||
fi
|
||||
git tag -a "v${VERSION}" -m "Release v${VERSION}"
|
||||
git push origin "v${VERSION}"
|
||||
@@ -0,0 +1,162 @@
|
||||
name: Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
# All PRs, including stacked PRs
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
UV_FROZEN: "1"
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
- name: Detect code changes
|
||||
id: changes
|
||||
run: ./.github/scripts/detect-changes.sh code "${{ github.event.pull_request.base.sha || github.event.before }}" "${{ github.sha }}"
|
||||
- name: Setup uv
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # setup-uv v8.1.0; uv 0.11.14
|
||||
with:
|
||||
version: "0.11.14"
|
||||
enable-cache: true
|
||||
- name: Install dependencies
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: make sync
|
||||
- name: Verify formatting
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: make format-check
|
||||
- name: Run lint
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: make lint
|
||||
- name: Skip lint
|
||||
if: steps.changes.outputs.run != 'true'
|
||||
run: echo "Skipping lint for non-code changes."
|
||||
|
||||
typecheck:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
- name: Detect code changes
|
||||
id: changes
|
||||
run: ./.github/scripts/detect-changes.sh code "${{ github.event.pull_request.base.sha || github.event.before }}" "${{ github.sha }}"
|
||||
- name: Setup uv
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # setup-uv v8.1.0; uv 0.11.14
|
||||
with:
|
||||
version: "0.11.14"
|
||||
enable-cache: true
|
||||
- name: Install dependencies
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: make sync
|
||||
- name: Run typecheck
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: make typecheck
|
||||
- name: Skip typecheck
|
||||
if: steps.changes.outputs.run != 'true'
|
||||
run: echo "Skipping typecheck for non-code changes."
|
||||
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version:
|
||||
- "3.10"
|
||||
- "3.11"
|
||||
- "3.12"
|
||||
- "3.13"
|
||||
- "3.14"
|
||||
env:
|
||||
OPENAI_API_KEY: fake-for-tests
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
- name: Detect code changes
|
||||
id: changes
|
||||
run: ./.github/scripts/detect-changes.sh code "${{ github.event.pull_request.base.sha || github.event.before }}" "${{ github.sha }}"
|
||||
- name: Setup uv
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # setup-uv v8.1.0; uv 0.11.14
|
||||
with:
|
||||
version: "0.11.14"
|
||||
enable-cache: true
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install dependencies
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: make sync
|
||||
- name: Run tests with coverage
|
||||
if: steps.changes.outputs.run == 'true' && matrix.python-version == '3.12'
|
||||
run: make coverage
|
||||
- name: Run tests
|
||||
if: steps.changes.outputs.run == 'true' && matrix.python-version != '3.12'
|
||||
run: make tests
|
||||
- name: Run async teardown stability tests
|
||||
if: steps.changes.outputs.run == 'true' && (matrix.python-version == '3.10' || matrix.python-version == '3.14')
|
||||
run: make tests-asyncio-stability
|
||||
- name: Skip tests
|
||||
if: steps.changes.outputs.run != 'true'
|
||||
run: echo "Skipping tests for non-code changes."
|
||||
|
||||
tests-windows:
|
||||
runs-on: windows-latest
|
||||
env:
|
||||
OPENAI_API_KEY: fake-for-tests
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
- name: Detect code changes
|
||||
id: changes
|
||||
shell: bash
|
||||
run: ./.github/scripts/detect-changes.sh code "${{ github.event.pull_request.base.sha || github.event.before }}" "${{ github.sha }}"
|
||||
- name: Setup uv
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # setup-uv v8.1.0; uv 0.11.14
|
||||
with:
|
||||
version: "0.11.14"
|
||||
enable-cache: true
|
||||
python-version: "3.13"
|
||||
- name: Install dependencies
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: uv sync --all-extras --all-packages --group dev
|
||||
- name: Run tests
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: uv run pytest
|
||||
- name: Skip tests
|
||||
if: steps.changes.outputs.run != 'true'
|
||||
run: echo "Skipping tests for non-code changes."
|
||||
|
||||
build-docs:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
OPENAI_API_KEY: fake-for-tests
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
|
||||
- name: Detect docs changes
|
||||
id: changes
|
||||
run: ./.github/scripts/detect-changes.sh docs "${{ github.event.pull_request.base.sha || github.event.before }}" "${{ github.sha }}"
|
||||
- name: Setup uv
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # setup-uv v8.1.0; uv 0.11.14
|
||||
with:
|
||||
version: "0.11.14"
|
||||
enable-cache: true
|
||||
- name: Install dependencies
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: make sync
|
||||
- name: Build docs
|
||||
if: steps.changes.outputs.run == 'true'
|
||||
run: make build-docs
|
||||
- name: Skip docs build
|
||||
if: steps.changes.outputs.run != 'true'
|
||||
run: echo "Skipping docs build for non-docs changes."
|
||||
Reference in New Issue
Block a user