codex-actionを使用してissueが作成されると自動でラベルを自動で追加するようにしてみました。
また、output-schemaを使用してラベルのみが回答されるようにしました。
実行は以下のようにしました。
- リポジトリ内のラベルの取得する
- ラベルの名前と説明をコンテキストに渡して、issueの内容に適したラベルを返す
- 返ってきたラベルをissueに追加する
name: Issue Triage
on:
issues:
types: [opened]
jobs:
analyze_issue:
runs-on: ubuntu-latest
permissions:
contents: read
issues: read
outputs:
final_message: ${{ steps.analyze_with_ai.outputs.final-message }}
triage_label: ${{ steps.extract_label.outputs.label }}
steps:
- name: Checkout repository
uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Fetch Repository Labels
id: get_labels
uses: actions/github-script@v7
with:
github-token: ${{ github.token }}
script: |
const { data } = await github.rest.issues.listLabelsForRepo({
owner: context.repo.owner,
repo: context.repo.repo
});
const labels = data.map(label => `${label.name}: ${label.description || 'No description'}`).join('\n');
const labelNames = JSON.stringify(data.map(label => label.name));
core.setOutput('labels', labels);
core.setOutput('label_names', labelNames);
- name: Generate Dynamic Schema with Label Enums
id: generate_schema
env:
LABEL_NAMES: ${{ steps.get_labels.outputs.label_names }}
run: |
schema=$(cat <<EOF
{
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "The most appropriate label for this issue based on its content and purpose",
"enum": $LABEL_NAMES
}
},
"required": [
"label"
],
"additionalProperties": false
}
EOF
)
echo "schema<<EOF" >> $GITHUB_OUTPUT
echo "$schema" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Analyze Issue with AI
id: analyze_with_ai
uses: openai/codex-action@v1
with:
openai-api-key: ${{ secrets.OPENAI_API_KEY }}
output-schema: ${{ steps.generate_schema.outputs.schema }}
prompt: |
Analyze this issue and determine the appropriate label.
Available labels:
${{ steps.get_labels.outputs.labels }}
Issue #${{ github.event.issue.number }}: ${{ github.event.issue.title }}
${{ github.event.issue.body }}
- name: Extract Label from AI Response
id: extract_label
env:
CODEX_FINAL_MESSAGE: ${{ steps.analyze_with_ai.outputs.final-message }}
run: |
label=$(echo "$CODEX_FINAL_MESSAGE" | jq -r '.label')
echo "label=$label" >> $GITHUB_OUTPUT
apply_label:
runs-on: ubuntu-latest
needs: analyze_issue
if: needs.analyze_issue.outputs.triage_label != ''
permissions:
issues: write
steps:
- name: Apply Label to Issue
uses: actions/github-script@v7
env:
TRIAGE_LABEL: ${{ needs.analyze_issue.outputs.triage_label }}
with:
github-token: ${{ github.token }}
script: |
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.issue.number,
labels: [process.env.TRIAGE_LABEL]
});
``