Structured Outputs
Structured Outputs ensure that the model always follows your supplied JSON schema. Portkey supports OpenAI’s Structured Outputs feature out of the box with our SDKs & APIs.
Structured Outputs is different from OpenAI’s JSON Mode
as well as Function Calling
. Check out this table for a quick comparison.
Portkey SDKs for Python and JavaScript also make it easy to define object schemas using Pydantic and Zod respectively. Below, you can see how to extract information from unstructured text that conforms to a schema defined in code.
from portkey_ai import Portkey
from pydantic import BaseModel
class Step(BaseModel):
explanation: str
output: str
class MathReasoning(BaseModel):
steps: list[Step]
final_answer: str
portkey = Portkey(
api_key="PORTKEY_API_KEY",
virtual_key="OPENAI_VIRTUAL_KEY"
)
completion = portkey.beta.chat.completions.parse(
model="gpt-4o-2024-08-06",
messages=[
{"role": "system", "content": "You are a helpful math tutor. Guide the user through the solution step by step."},
{"role": "user", "content": "how can I solve 8x + 7 = -23"}
],
response_format=MathReasoning,
)
print(completion.choices[0].message)
print(completion.choices[0].message.parsed)
The second approach, shown in the subsequent examples, uses a JSON schema directly in the API call. This method is more portable across different languages and doesn’t require additional libraries, but lacks the integrated type checking of the Pydantic/Zod approach. Choose the method that best fits your project’s needs and language ecosystem.
import Portkey from "portkey-ai";
const portkey = new Portkey({
apiKey: "PORTKEY_API_KEY",
virtualKey: "OPENAI_VIRTUAL_KEY",
});
async function main() {
const completion = await portkey.chat.completions.create({
model: "gpt-4o-2024-08-06",
messages: [
{ role: "system", content: "Extract the event information." },
{
role: "user",
content: "Alice and Bob are going to a science fair on Friday.",
},
],
response_format: {
type: "json_schema",
json_schema: {
name: "math_reasoning",
schema: {
type: "object",
properties: {
steps: {
type: "array",
items: {
type: "object",
properties: {
explanation: { type: "string" },
output: { type: "string" },
},
required: ["explanation", "output"],
additionalProperties: false,
},
},
final_answer: { type: "string" },
},
required: ["steps", "final_answer"],
additionalProperties: false,
},
strict: true,
},
},
});
const event = completion.choices[0].message?.content;
console.log(event);
}
main();
Difference Between Structured Outputs, JSON Mode, and Function Calling
- If you are connecting the model to tools, functions, data, etc. in your system, then you should use function calling.
- And if you want to structure the model’s output when it responds to the user, then you should use a structured
response_format
.- In
response_format
, you can set it as{ "type": "json_object" }
to enable the JSON Mode. - And you can set it as
{ "type": "json_schema" }
to use the Structured Outputs Mode described above.
- In
For more, refer to OpenAI’s detailed documentation on Structured Outputs here.
Was this page helpful?