<?php
use Cognesy\Polyglot\Inference\Inference;
use Cognesy\Polyglot\Inference\Enums\OutputMode;
use Cognesy\Utils\JsonSchema\JsonSchema;
// Define address schema
$addressSchema = JsonSchema::object(
name: 'address',
properties: [
JsonSchema::string('street', 'Street address'),
JsonSchema::string('city', 'City name'),
JsonSchema::string('postal_code', 'Postal/ZIP code'),
JsonSchema::string('country', 'Country name'),
],
requiredProperties: ['city', 'country'],
);
// Define contact schema
$contactSchema = JsonSchema::object(
name: 'contact',
properties: [
JsonSchema::string('email', 'Email address'),
JsonSchema::string('phone', 'Phone number', nullable: true),
],
requiredProperties: ['email', 'phone'],
);
// Define hobbies schema
$hobbiesSchema = JsonSchema::array(
name: 'hobbies',
description: 'List of user hobbies',
itemSchema: JsonSchema::object(
properties: [
JsonSchema::string('name', 'Hobby name'),
JsonSchema::string('description', 'Hobby description', nullable: true),
JsonSchema::integer('years_experience', 'Years of experience', nullable: true),
],
requiredProperties: ['name'],
),
);
// Define main user schema
$userSchema = JsonSchema::object(
properties: [
JsonSchema::string('name', 'User\'s full name'),
JsonSchema::integer('age', 'User\'s age'),
$addressSchema,
$contactSchema,
$hobbiesSchema,
JsonSchema::enum(
'status',
'Account status',
enumValues: ['active', 'inactive', 'pending'],
),
],
requiredProperties: ['name', 'age', 'address', 'contact', 'status'],
);
// Use the schema with Inference
$userData = (new Inference)
->using('openai')
->with(
messages: [
['role' => 'user', 'content' => 'Generate a profile for John Doe who lives in New York.']
],
responseFormat: [
'type' => 'json_schema',
'description' => 'User profile data',
'json_schema' => [
'name' => 'user_profile',
'schema' => $userSchema->toJsonSchema(),
'strict' => true,
],
],
mode: OutputMode::JsonSchema,
)
->asJsonData();
print_r($userData);