39
39
required : false
40
40
LLM_API_KEY :
41
41
required : true
42
+ APP_ID :
43
+ required : false
44
+ APP_PRIVATE_KEY :
45
+ required : false
42
46
LLM_BASE_URL :
43
47
required : false
44
48
PAT_TOKEN :
89
93
with :
90
94
python-version : " 3.12"
91
95
96
+ - name : Generate GitHub App Token
97
+ id : generate-token
98
+ # Only run if App ID and Key are provided via secrets
99
+ if : secrets.APP_ID && secrets.APP_PRIVATE_KEY
100
+ uses : actions/create-github-app-token@v1
101
+ with :
102
+ app-id : ${{ secrets.APP_ID }}
103
+ private-key : ${{ secrets.APP_PRIVATE_KEY }}
104
+
105
+ - name : Determine Auth Token
106
+ id : determine-auth-token
107
+ run : |
108
+ if [ -n "${{ steps.generate-token.outputs.token }}" ]; then
109
+ echo "Using GitHub App Token"
110
+ echo "AUTH_TOKEN=${{ steps.generate-token.outputs.token }}" >> $GITHUB_ENV
111
+ elif [ -n "${{ secrets.PAT_TOKEN }}" ]; then
112
+ echo "Using PAT Token"
113
+ echo "AUTH_TOKEN=${{ secrets.PAT_TOKEN }}" >> $GITHUB_ENV
114
+ else
115
+ echo "Using default GITHUB_TOKEN"
116
+ echo "AUTH_TOKEN=${{ github.token }}" >> $GITHUB_ENV
117
+ fi
92
118
- name : Get latest versions and create requirements.txt
93
119
run : |
94
120
python -m pip index versions openhands-ai > openhands_versions.txt
@@ -126,7 +152,7 @@ jobs:
126
152
LLM_API_VERSION : ${{ inputs.LLM_API_VERSION }}
127
153
PAT_TOKEN : ${{ secrets.PAT_TOKEN }}
128
154
PAT_USERNAME : ${{ secrets.PAT_USERNAME }}
129
- GITHUB_TOKEN : ${{ github. token }}
155
+ APP_TOKEN_GENERATED : ${{ steps.generate- token.outputs.token && 'true' || 'false' }}
130
156
run : |
131
157
required_vars=("LLM_API_KEY")
132
158
for var in "${required_vars[@]}"; do
@@ -141,8 +167,13 @@ jobs:
141
167
echo "Warning: LLM_BASE_URL is not set, will use default API endpoint"
142
168
fi
143
169
144
- if [ -z "$PAT_TOKEN" ]; then
145
- echo "Warning: PAT_TOKEN is not set, falling back to GITHUB_TOKEN"
170
+ # Check auth token source
171
+ if [ "$APP_TOKEN_GENERATED" == "true" ]; then
172
+ echo "Info: Using GitHub App Token for authentication."
173
+ elif [ -n "$PAT_TOKEN" ]; then
174
+ echo "Info: Using PAT_TOKEN for authentication."
175
+ else
176
+ echo "Warning: Neither App Token nor PAT_TOKEN is set, falling back to default GITHUB_TOKEN. This may have insufficient permissions."
146
177
fi
147
178
148
179
if [ -z "$PAT_USERNAME" ]; then
@@ -178,16 +209,16 @@ jobs:
178
209
fi
179
210
180
211
echo "MAX_ITERATIONS=${{ inputs.max_iterations || 50 }}" >> $GITHUB_ENV
181
- echo "SANDBOX_ENV_GITHUB_TOKEN=${{ secrets.PAT_TOKEN || github.token }}" >> $GITHUB_ENV
182
- echo "SANDBOX_BASE_CONTAINER_IMAGE =${{ inputs.base_container_image }}" >> $GITHUB_ENV
212
+ echo "SANDBOX_ENV_GITHUB_TOKEN=${{ env.AUTH_TOKEN }}" >> $GITHUB_ENV
213
+ echo "SANDBOX_ENV_BASE_CONTAINER_IMAGE =${{ inputs.base_container_image }}" >> $GITHUB_ENV
183
214
184
215
# Set branch variables
185
216
echo "TARGET_BRANCH=${{ inputs.target_branch || 'main' }}" >> $GITHUB_ENV
186
217
187
218
- name : Comment on issue with start message
188
219
uses : actions/github-script@v7
189
220
with :
190
- github-token : ${{ secrets.PAT_TOKEN || github.token }}
221
+ github-token : ${{ env.AUTH_TOKEN }}
191
222
script : |
192
223
const issueType = process.env.ISSUE_TYPE;
193
224
github.rest.issues.createComment({
@@ -235,7 +266,7 @@ jobs:
235
266
236
267
- name : Attempt to resolve issue
237
268
env :
238
- GITHUB_TOKEN : ${{ secrets.PAT_TOKEN || github.token }}
269
+ GITHUB_TOKEN : ${{ env.AUTH_TOKEN }}
239
270
GITHUB_USERNAME : ${{ secrets.PAT_USERNAME || 'openhands-agent' }}
240
271
GIT_USERNAME : ${{ secrets.PAT_USERNAME || 'openhands-agent' }}
241
272
LLM_MODEL : ${{ secrets.LLM_MODEL || inputs.LLM_MODEL }}
@@ -272,7 +303,7 @@ jobs:
272
303
- name : Create draft PR or push branch
273
304
if : always() # Create PR or branch even if the previous steps fail
274
305
env :
275
- GITHUB_TOKEN : ${{ secrets.PAT_TOKEN || github.token }}
306
+ GITHUB_TOKEN : ${{ env.AUTH_TOKEN }}
276
307
GITHUB_USERNAME : ${{ secrets.PAT_USERNAME || 'openhands-agent' }}
277
308
GIT_USERNAME : ${{ secrets.PAT_USERNAME || 'openhands-agent' }}
278
309
LLM_MODEL : ${{ secrets.LLM_MODEL || inputs.LLM_MODEL }}
@@ -304,7 +335,7 @@ jobs:
304
335
AGENT_RESPONDED : ${{ env.AGENT_RESPONDED || 'false' }}
305
336
ISSUE_NUMBER : ${{ env.ISSUE_NUMBER }}
306
337
with :
307
- github-token : ${{ secrets.PAT_TOKEN || github.token }}
338
+ github-token : ${{ env.AUTH_TOKEN }}
308
339
script : |
309
340
const fs = require('fs');
310
341
const issueNumber = process.env.ISSUE_NUMBER;
@@ -341,7 +372,7 @@ jobs:
341
372
ISSUE_NUMBER : ${{ env.ISSUE_NUMBER }}
342
373
RESOLUTION_SUCCESS : ${{ steps.check_result.outputs.RESOLUTION_SUCCESS }}
343
374
with :
344
- github-token : ${{ secrets.PAT_TOKEN || github.token }}
375
+ github-token : ${{ env.AUTH_TOKEN }}
345
376
script : |
346
377
const fs = require('fs');
347
378
const path = require('path');
@@ -414,7 +445,7 @@ jobs:
414
445
env :
415
446
ISSUE_NUMBER : ${{ env.ISSUE_NUMBER }}
416
447
with :
417
- github-token : ${{ secrets.PAT_TOKEN || github.token }}
448
+ github-token : ${{ env.AUTH_TOKEN }}
418
449
script : |
419
450
const issueNumber = process.env.ISSUE_NUMBER;
420
451
0 commit comments