Merge with main
This commit is contained in:
@@ -106,6 +106,8 @@ describe('helpers.ts - inference request building', () => {
|
|||||||
undefined,
|
undefined,
|
||||||
undefined,
|
undefined,
|
||||||
'gpt-4',
|
'gpt-4',
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
100,
|
100,
|
||||||
'https://api.test.com',
|
'https://api.test.com',
|
||||||
'test-token',
|
'test-token',
|
||||||
@@ -117,6 +119,8 @@ describe('helpers.ts - inference request building', () => {
|
|||||||
{role: 'user', content: 'User message'},
|
{role: 'user', content: 'User message'},
|
||||||
],
|
],
|
||||||
modelName: 'gpt-4',
|
modelName: 'gpt-4',
|
||||||
|
temperature: undefined,
|
||||||
|
topP: undefined,
|
||||||
maxTokens: 100,
|
maxTokens: 100,
|
||||||
endpoint: 'https://api.test.com',
|
endpoint: 'https://api.test.com',
|
||||||
token: 'test-token',
|
token: 'test-token',
|
||||||
@@ -136,6 +140,8 @@ describe('helpers.ts - inference request building', () => {
|
|||||||
'System prompt',
|
'System prompt',
|
||||||
'User prompt',
|
'User prompt',
|
||||||
'gpt-4',
|
'gpt-4',
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
100,
|
100,
|
||||||
'https://api.test.com',
|
'https://api.test.com',
|
||||||
'test-token',
|
'test-token',
|
||||||
@@ -147,6 +153,8 @@ describe('helpers.ts - inference request building', () => {
|
|||||||
{role: 'user', content: 'User prompt'},
|
{role: 'user', content: 'User prompt'},
|
||||||
],
|
],
|
||||||
modelName: 'gpt-4',
|
modelName: 'gpt-4',
|
||||||
|
temperature: undefined,
|
||||||
|
topP: undefined,
|
||||||
maxTokens: 100,
|
maxTokens: 100,
|
||||||
endpoint: 'https://api.test.com',
|
endpoint: 'https://api.test.com',
|
||||||
token: 'test-token',
|
token: 'test-token',
|
||||||
|
|||||||
+20
-6
@@ -49505,6 +49505,8 @@ async function simpleInference(request) {
|
|||||||
messages: request.messages,
|
messages: request.messages,
|
||||||
max_tokens: request.maxTokens,
|
max_tokens: request.maxTokens,
|
||||||
model: request.modelName,
|
model: request.modelName,
|
||||||
|
temperature: request.temperature,
|
||||||
|
top_p: request.topP,
|
||||||
};
|
};
|
||||||
// Add response format if specified
|
// Add response format if specified
|
||||||
if (request.responseFormat) {
|
if (request.responseFormat) {
|
||||||
@@ -49539,6 +49541,8 @@ async function mcpInference(request, githubMcpClient) {
|
|||||||
messages: messages,
|
messages: messages,
|
||||||
max_tokens: request.maxTokens,
|
max_tokens: request.maxTokens,
|
||||||
model: request.modelName,
|
model: request.modelName,
|
||||||
|
temperature: request.temperature,
|
||||||
|
top_p: request.topP,
|
||||||
};
|
};
|
||||||
// Add response format if specified (only on final iteration to avoid conflicts with tool calls)
|
// Add response format if specified (only on final iteration to avoid conflicts with tool calls)
|
||||||
if (finalMessage && request.responseFormat) {
|
if (finalMessage && request.responseFormat) {
|
||||||
@@ -49694,12 +49698,14 @@ function buildResponseFormat(promptConfig) {
|
|||||||
/**
|
/**
|
||||||
* Build complete InferenceRequest from prompt config and inputs
|
* Build complete InferenceRequest from prompt config and inputs
|
||||||
*/
|
*/
|
||||||
function buildInferenceRequest(promptConfig, systemPrompt, prompt, modelName, maxTokens, endpoint, token) {
|
function buildInferenceRequest(promptConfig, systemPrompt, prompt, modelName, temperature, topP, maxTokens, endpoint, token) {
|
||||||
const messages = buildMessages(promptConfig, systemPrompt, prompt);
|
const messages = buildMessages(promptConfig, systemPrompt, prompt);
|
||||||
const responseFormat = buildResponseFormat(promptConfig);
|
const responseFormat = buildResponseFormat(promptConfig);
|
||||||
return {
|
return {
|
||||||
messages,
|
messages,
|
||||||
modelName,
|
modelName,
|
||||||
|
temperature,
|
||||||
|
topP,
|
||||||
maxTokens,
|
maxTokens,
|
||||||
endpoint,
|
endpoint,
|
||||||
token,
|
token,
|
||||||
@@ -52581,10 +52587,8 @@ function loadPromptFile(filePath, templateVariables = {}) {
|
|||||||
throw new Error(`Prompt file not found: ${filePath}`);
|
throw new Error(`Prompt file not found: ${filePath}`);
|
||||||
}
|
}
|
||||||
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
||||||
// Apply template variable substitution
|
|
||||||
const processedContent = replaceTemplateVariables(fileContent, templateVariables);
|
|
||||||
try {
|
try {
|
||||||
const config = load(processedContent);
|
const config = load(fileContent);
|
||||||
if (!config.messages || !Array.isArray(config.messages)) {
|
if (!config.messages || !Array.isArray(config.messages)) {
|
||||||
throw new Error('Prompt file must contain a "messages" array');
|
throw new Error('Prompt file must contain a "messages" array');
|
||||||
}
|
}
|
||||||
@@ -52597,6 +52601,13 @@ function loadPromptFile(filePath, templateVariables = {}) {
|
|||||||
throw new Error(`Invalid message role: ${message.role}`);
|
throw new Error(`Invalid message role: ${message.role}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Prepare messages by replacing template variables with actual content
|
||||||
|
config.messages = config.messages.map(msg => {
|
||||||
|
return {
|
||||||
|
...msg,
|
||||||
|
content: replaceTemplateVariables(msg.content, templateVariables),
|
||||||
|
};
|
||||||
|
});
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
@@ -52644,7 +52655,10 @@ async function run() {
|
|||||||
}
|
}
|
||||||
// Get common parameters
|
// Get common parameters
|
||||||
const modelName = promptConfig?.model || coreExports.getInput('model');
|
const modelName = promptConfig?.model || coreExports.getInput('model');
|
||||||
const maxTokens = parseInt(coreExports.getInput('max-tokens'), 10);
|
let maxTokens = promptConfig?.modelParameters?.maxTokens ?? coreExports.getInput('max-tokens');
|
||||||
|
if (typeof maxTokens === 'string') {
|
||||||
|
maxTokens = parseInt(maxTokens, 10);
|
||||||
|
}
|
||||||
const token = process.env['GITHUB_TOKEN'] || coreExports.getInput('token');
|
const token = process.env['GITHUB_TOKEN'] || coreExports.getInput('token');
|
||||||
if (token === undefined) {
|
if (token === undefined) {
|
||||||
throw new Error('GITHUB_TOKEN is not set');
|
throw new Error('GITHUB_TOKEN is not set');
|
||||||
@@ -52654,7 +52668,7 @@ async function run() {
|
|||||||
const githubMcpToolsets = coreExports.getInput('github-mcp-toolsets');
|
const githubMcpToolsets = coreExports.getInput('github-mcp-toolsets');
|
||||||
const endpoint = coreExports.getInput('endpoint');
|
const endpoint = coreExports.getInput('endpoint');
|
||||||
// Build the inference request with pre-processed messages and response format
|
// Build the inference request with pre-processed messages and response format
|
||||||
const inferenceRequest = buildInferenceRequest(promptConfig, systemPrompt, prompt, modelName, maxTokens, endpoint, token);
|
const inferenceRequest = buildInferenceRequest(promptConfig, systemPrompt, prompt, modelName, promptConfig?.modelParameters?.temperature, promptConfig?.modelParameters?.topP, maxTokens, endpoint, token);
|
||||||
const enableMcp = coreExports.getBooleanInput('enable-github-mcp') || false;
|
const enableMcp = coreExports.getBooleanInput('enable-github-mcp') || false;
|
||||||
let modelResponse = null;
|
let modelResponse = null;
|
||||||
if (enableMcp) {
|
if (enableMcp) {
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -82,6 +82,8 @@ export function buildInferenceRequest(
|
|||||||
systemPrompt: string | undefined,
|
systemPrompt: string | undefined,
|
||||||
prompt: string | undefined,
|
prompt: string | undefined,
|
||||||
modelName: string,
|
modelName: string,
|
||||||
|
temperature: number | undefined,
|
||||||
|
topP: number | undefined,
|
||||||
maxTokens: number,
|
maxTokens: number,
|
||||||
endpoint: string,
|
endpoint: string,
|
||||||
token: string,
|
token: string,
|
||||||
@@ -92,6 +94,8 @@ export function buildInferenceRequest(
|
|||||||
return {
|
return {
|
||||||
messages,
|
messages,
|
||||||
modelName,
|
modelName,
|
||||||
|
temperature,
|
||||||
|
topP,
|
||||||
maxTokens,
|
maxTokens,
|
||||||
endpoint,
|
endpoint,
|
||||||
token,
|
token,
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ export interface InferenceRequest {
|
|||||||
maxTokens: number
|
maxTokens: number
|
||||||
endpoint: string
|
endpoint: string
|
||||||
token: string
|
token: string
|
||||||
|
temperature?: number
|
||||||
|
topP?: number
|
||||||
responseFormat?: {type: 'json_schema'; json_schema: unknown} // Processed response format for the API
|
responseFormat?: {type: 'json_schema'; json_schema: unknown} // Processed response format for the API
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,6 +47,8 @@ export async function simpleInference(request: InferenceRequest): Promise<string
|
|||||||
messages: request.messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],
|
messages: request.messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],
|
||||||
max_tokens: request.maxTokens,
|
max_tokens: request.maxTokens,
|
||||||
model: request.modelName,
|
model: request.modelName,
|
||||||
|
temperature: request.temperature,
|
||||||
|
top_p: request.topP,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add response format if specified
|
// Add response format if specified
|
||||||
@@ -90,6 +94,8 @@ export async function mcpInference(
|
|||||||
messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],
|
messages: messages as OpenAI.Chat.Completions.ChatCompletionMessageParam[],
|
||||||
max_tokens: request.maxTokens,
|
max_tokens: request.maxTokens,
|
||||||
model: request.modelName,
|
model: request.modelName,
|
||||||
|
temperature: request.temperature,
|
||||||
|
top_p: request.topP,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add response format if specified (only on final iteration to avoid conflicts with tool calls)
|
// Add response format if specified (only on final iteration to avoid conflicts with tool calls)
|
||||||
|
|||||||
+7
-1
@@ -53,7 +53,11 @@ export async function run(): Promise<void> {
|
|||||||
|
|
||||||
// Get common parameters
|
// Get common parameters
|
||||||
const modelName = promptConfig?.model || core.getInput('model')
|
const modelName = promptConfig?.model || core.getInput('model')
|
||||||
const maxTokens = parseInt(core.getInput('max-tokens'), 10)
|
let maxTokens = promptConfig?.modelParameters?.maxTokens ?? core.getInput('max-tokens')
|
||||||
|
|
||||||
|
if (typeof maxTokens === 'string') {
|
||||||
|
maxTokens = parseInt(maxTokens, 10)
|
||||||
|
}
|
||||||
|
|
||||||
const token = process.env['GITHUB_TOKEN'] || core.getInput('token')
|
const token = process.env['GITHUB_TOKEN'] || core.getInput('token')
|
||||||
if (token === undefined) {
|
if (token === undefined) {
|
||||||
@@ -72,6 +76,8 @@ export async function run(): Promise<void> {
|
|||||||
systemPrompt,
|
systemPrompt,
|
||||||
prompt,
|
prompt,
|
||||||
modelName,
|
modelName,
|
||||||
|
promptConfig?.modelParameters?.temperature,
|
||||||
|
promptConfig?.modelParameters?.topP,
|
||||||
maxTokens,
|
maxTokens,
|
||||||
endpoint,
|
endpoint,
|
||||||
token,
|
token,
|
||||||
|
|||||||
+16
-4
@@ -7,9 +7,16 @@ export interface PromptMessage {
|
|||||||
content: string
|
content: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ModelParameters {
|
||||||
|
maxTokens?: number
|
||||||
|
temperature?: number
|
||||||
|
topP?: number
|
||||||
|
}
|
||||||
|
|
||||||
export interface PromptConfig {
|
export interface PromptConfig {
|
||||||
messages: PromptMessage[]
|
messages: PromptMessage[]
|
||||||
model?: string
|
model?: string
|
||||||
|
modelParameters?: ModelParameters
|
||||||
responseFormat?: 'text' | 'json_schema'
|
responseFormat?: 'text' | 'json_schema'
|
||||||
jsonSchema?: string
|
jsonSchema?: string
|
||||||
}
|
}
|
||||||
@@ -101,11 +108,8 @@ export function loadPromptFile(filePath: string, templateVariables: TemplateVari
|
|||||||
|
|
||||||
const fileContent = fs.readFileSync(filePath, 'utf-8')
|
const fileContent = fs.readFileSync(filePath, 'utf-8')
|
||||||
|
|
||||||
// Apply template variable substitution
|
|
||||||
const processedContent = replaceTemplateVariables(fileContent, templateVariables)
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const config = yaml.load(processedContent) as PromptConfig
|
const config = yaml.load(fileContent) as PromptConfig
|
||||||
|
|
||||||
if (!config.messages || !Array.isArray(config.messages)) {
|
if (!config.messages || !Array.isArray(config.messages)) {
|
||||||
throw new Error('Prompt file must contain a "messages" array')
|
throw new Error('Prompt file must contain a "messages" array')
|
||||||
@@ -121,6 +125,14 @@ export function loadPromptFile(filePath: string, templateVariables: TemplateVari
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prepare messages by replacing template variables with actual content
|
||||||
|
config.messages = config.messages.map(msg => {
|
||||||
|
return {
|
||||||
|
...msg,
|
||||||
|
content: replaceTemplateVariables(msg.content, templateVariables),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
return config
|
return config
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new Error(`Failed to parse prompt file: ${error instanceof Error ? error.message : 'Unknown error'}`)
|
throw new Error(`Failed to parse prompt file: ${error instanceof Error ? error.message : 'Unknown error'}`)
|
||||||
|
|||||||
Reference in New Issue
Block a user