83 lines
2.3 KiB
JavaScript
83 lines
2.3 KiB
JavaScript
import OpenAI from 'openai'
|
|
const openai = new OpenAI({
|
|
apiKey:
|
|
'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'
|
|
}) // or set environment: export OPENAI_API_KEY=...
|
|
|
|
const my = {
|
|
model: 'gpt-5-nano'
|
|
}
|
|
|
|
const tools = [
|
|
{
|
|
type: 'function',
|
|
name: 'get_horoscope',
|
|
description: "Get today's horoscope for an astrological sign.",
|
|
parameters: {
|
|
type: 'object',
|
|
properties: {
|
|
sign: {
|
|
type: 'string',
|
|
description: 'An astrological sign like Taurus or Aquarius'
|
|
}
|
|
},
|
|
required: ['sign']
|
|
}
|
|
}
|
|
]
|
|
|
|
const api = {
|
|
get_horoscope ({ sign } = {}) {
|
|
return sign + ' Next Tuesday you will befriend a baby otter.'
|
|
}
|
|
}
|
|
|
|
// Create a running input list we will add to over time
|
|
let input = [
|
|
{ role: 'user', content: 'What is my horoscope? I am an Aquarius.' }
|
|
]
|
|
|
|
// 2. Prompt the model with tools defined
|
|
let response = await openai.responses.create({
|
|
model: my.model,
|
|
tools,
|
|
input
|
|
})
|
|
|
|
console.log('==========Response 1. round')
|
|
console.log(JSON.stringify(response, null, 2)) // response.output_text/output_parsed
|
|
|
|
input.push(...response.output) // add the model's response to the input, including any function calls, otherwise the next request reports: 'BadRequestError: 400 No tool call found for function call output with call_id ...'
|
|
|
|
response.output.forEach(item => {
|
|
if (item.type == 'function_call') {
|
|
if (typeof api[item.name] === 'function') {
|
|
console.log('function call =', item)
|
|
|
|
const function_call_output = api[item.name](JSON.parse(item.arguments))
|
|
console.log('function call output =', function_call_output)
|
|
|
|
// 4. Provide function call results to the model
|
|
input.push({
|
|
type: 'function_call_output',
|
|
call_id: item.call_id,
|
|
output: function_call_output.toString()
|
|
})
|
|
}
|
|
}
|
|
})
|
|
|
|
console.log('=========Input appended with function call output')
|
|
console.log(JSON.stringify(input, null, 2))
|
|
|
|
response = await openai.responses.create({
|
|
model: my.model,
|
|
//instructions: 'Respond only with a horoscope generated by a tool.',
|
|
tools,
|
|
input
|
|
})
|
|
|
|
// 5. The model should be able to give a response!
|
|
console.log('============Final output:')
|
|
console.log(JSON.stringify(response.output, null, 2))
|