Compare commits

...

7 Commits

Author SHA1 Message Date
Sean Goedecke 850c05ea4d dist 2025-04-07 22:52:09 +00:00
Sean Goedecke 701473dc11 use publisher 2025-04-07 22:43:25 +00:00
Sean Goedecke 786ceefcbc more logging 2025-04-07 22:31:16 +00:00
Sean Goedecke cb41259270 add logging 2025-04-07 22:26:14 +00:00
Sean Goedecke a57b52eccd Merge pull request #6 from actions/sgoedecke/configurable-token
Make token configurable
2025-04-07 15:21:27 +10:00
Sean Goedecke 32ebbe708a Make token configurable 2025-04-07 04:53:19 +00:00
Sean Goedecke fbd6a39716 Merge pull request #3 from actions/sgoedecke/initial-setup
Setup initial inference flow and install packages
2025-04-07 13:11:52 +10:00
7 changed files with 57 additions and 26 deletions
+2 -1
View File
@@ -9,7 +9,8 @@ ACTIONS_STEP_DEBUG=true
# GitHub Actions inputs should follow `INPUT_<name>` format (case-sensitive).
# Hyphens should not be converted to underscores!
INPUT_PROMPT=hello
INPUT_prompt=hello
INPUT_token=
# GitHub Actions default environment variables. These are set for every run of a
# workflow and can be used in your actions. Setting the value here will override
+8 -7
View File
@@ -31,13 +31,14 @@ steps:
Various inputs are defined in [`action.yml`](action.yml) to let you configure
the action:
| Name | Description | Default |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
| `token` | Token to use for inference. Typically the GITHUB_TOKEN secret | `github.token` |
| `prompt` | The prompt to send to the model | N/A |
| `model` | The model to use for inference. Must be available in the [GitHub Models](https://github.com/marketplace?type=models) catalog | `gpt-4o` |
| `endpoint` | The endpoint to use for inference. If you're running this as part of an org, you should probably use the org-specific Models endpoint | `https://models.github.ai/inference` |
| `max_tokens` | The max number of tokens to generate | 200 |
| Name | Description | Default |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
| `token` | Token to use for inference. Typically the GITHUB_TOKEN secret | `github.token` |
| `prompt` | The prompt to send to the model | N/A |
| `system-prompt` | The system prompt to send to the model | `""` |
| `model` | The model to use for inference. Must be available in the [GitHub Models](https://github.com/marketplace?type=models) catalog | `gpt-4o` |
| `endpoint` | The endpoint to use for inference. If you're running this as part of an org, you should probably use the org-specific Models endpoint | `https://models.github.ai/inference` |
| `max-tokens` | The max number of tokens to generate | 200 |
## Outputs
+11 -3
View File
@@ -10,21 +10,29 @@ branding:
# Define your inputs here.
inputs:
prompt:
description: Your input description here
description: The prompt for the model
required: true
default: ''
model:
description: The model to use
required: false
default: 'gpt-4o'
default: 'openai/gpt-4o'
endpoint:
description: The endpoint to use
required: false
default: 'https://models.github.ai/inference'
max_tokens:
system-prompt:
description: The system prompt for the model
required: false
default: 'You are a helpful assistant'
max-tokens:
description: The maximum number of tokens to generate
required: false
default: '200'
token:
description: The token to use
required: false
default: ${{ github.token }}
# Define your outputs here.
outputs:
+1 -1
View File
@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="116" height="20" role="img" aria-label="Coverage: 89.47%"><title>Coverage: 89.47%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="116" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="63" height="20" fill="#555"/><rect x="63" width="53" height="20" fill="#dfb317"/><rect width="116" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="325" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">Coverage</text><text x="325" y="140" transform="scale(.1)" fill="#fff" textLength="530">Coverage</text><text aria-hidden="true" x="885" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">89.47%</text><text x="885" y="140" transform="scale(.1)" fill="#fff" textLength="430">89.47%</text></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="116" height="20" role="img" aria-label="Coverage: 77.27%"><title>Coverage: 77.27%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="116" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="63" height="20" fill="#555"/><rect x="63" width="53" height="20" fill="#e05d44"/><rect width="116" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="325" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">Coverage</text><text x="325" y="140" transform="scale(.1)" fill="#fff" textLength="530">Coverage</text><text aria-hidden="true" x="885" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="430">77.27%</text><text x="885" y="140" transform="scale(.1)" fill="#fff" textLength="430">77.27%</text></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Generated Vendored
+16 -6
View File
@@ -33559,10 +33559,10 @@ async function run() {
if (prompt === undefined || prompt === '') {
throw new Error('prompt is not set');
}
const systemPrompt = coreExports.getInput('system_prompt');
const systemPrompt = coreExports.getInput('system-prompt');
const modelName = coreExports.getInput('model');
const maxTokens = parseInt(coreExports.getInput('max_tokens'), 10);
const token = process.env['GITHUB_TOKEN'];
const maxTokens = parseInt(coreExports.getInput('max-tokens'), 10);
const token = coreExports.getInput('token') || process.env['GITHUB_TOKEN'];
if (token === undefined) {
throw new Error('GITHUB_TOKEN is not set');
}
@@ -33573,7 +33573,7 @@ async function run() {
messages: [
{
role: 'system',
content: systemPrompt || 'You are a helpful assistant.'
content: systemPrompt
},
{ role: 'user', content: prompt }
],
@@ -33584,7 +33584,13 @@ async function run() {
}
});
if (isUnexpected(response)) {
throw response.body.error;
if (response.body.error) {
throw response.body.error;
}
throw new Error('An error occurred while fetching the response (' +
response.status +
'): ' +
response.body);
}
const modelResponse = response.body.choices[0].message.content;
// Set outputs for other workflow steps to use
@@ -33592,8 +33598,12 @@ async function run() {
}
catch (error) {
// Fail the workflow run if an error occurs
if (error instanceof Error)
if (error instanceof Error) {
coreExports.setFailed(error.message);
}
else {
coreExports.setFailed('An unexpected error occurred');
}
}
}
Generated Vendored
+1 -1
View File
File diff suppressed because one or more lines are too long
+18 -7
View File
@@ -14,11 +14,11 @@ export async function run(): Promise<void> {
throw new Error('prompt is not set')
}
const systemPrompt: string = core.getInput('system_prompt')
const systemPrompt: string = core.getInput('system-prompt')
const modelName: string = core.getInput('model')
const maxTokens: number = parseInt(core.getInput('max_tokens'), 10)
const maxTokens: number = parseInt(core.getInput('max-tokens'), 10)
const token = process.env['GITHUB_TOKEN']
const token = core.getInput('token') || process.env['GITHUB_TOKEN']
if (token === undefined) {
throw new Error('GITHUB_TOKEN is not set')
}
@@ -31,7 +31,7 @@ export async function run(): Promise<void> {
messages: [
{
role: 'system',
content: systemPrompt || 'You are a helpful assistant.'
content: systemPrompt
},
{ role: 'user', content: prompt }
],
@@ -43,9 +43,16 @@ export async function run(): Promise<void> {
})
if (isUnexpected(response)) {
throw response.body.error
if (response.body.error) {
throw response.body.error
}
throw new Error(
'An error occurred while fetching the response (' +
response.status +
'): ' +
response.body
)
}
const modelResponse: string | null =
response.body.choices[0].message.content
@@ -53,6 +60,10 @@ export async function run(): Promise<void> {
core.setOutput('response', modelResponse || '')
} catch (error) {
// Fail the workflow run if an error occurs
if (error instanceof Error) core.setFailed(error.message)
if (error instanceof Error) {
core.setFailed(error.message)
} else {
core.setFailed('An unexpected error occurred')
}
}
}