diff --git a/examples/02_Advanced/LanguagePrograms2/run.php b/examples/02_Advanced/LanguagePrograms2/run.php index 2b4f8f30..5739beaf 100644 --- a/examples/02_Advanced/LanguagePrograms2/run.php +++ b/examples/02_Advanced/LanguagePrograms2/run.php @@ -25,13 +25,15 @@ ```php add('Cognesy\\Instructor\\', __DIR__ . '../../src/'); @@ -63,7 +65,10 @@ class FixedEmail extends SignatureData { public string $fixedBody; } -class EmailTranslation extends SignatureData { +// Alternative way to define the module signature data without extending a class +class EmailTranslation implements HasInputOutputData, CanProvideSchema { + use AutoSignature; + #[InputField('subject of email')] public string $subject; #[InputField('body of email')] diff --git a/src/Extras/Module/Addons/Predict/Predict.php b/src/Extras/Module/Addons/Predict/Predict.php index f0630832..df769178 100644 --- a/src/Extras/Module/Addons/Predict/Predict.php +++ b/src/Extras/Module/Addons/Predict/Predict.php @@ -4,6 +4,7 @@ use BackedEnum; use Cognesy\Instructor\Data\Example; +use Cognesy\Instructor\Enums\Mode; use Cognesy\Instructor\Extras\Module\Core\DynamicModule; use Cognesy\Instructor\Extras\Module\Signature\Contracts\HasSignature; use Cognesy\Instructor\Extras\Module\Signature\Signature; @@ -16,11 +17,17 @@ class Predict extends DynamicModule { - private Instructor $instructor; + protected Instructor $instructor; + protected string $prompt; - protected string $defaultPrompt = 'Your job is to infer output argument values in input data based on specification: {signature} {description}'; + protected $options = []; + protected $model = 'gpt-4o'; + protected $mode = Mode::Tools; + protected array $examples = []; protected int $maxRetries = 3; + protected string $defaultPrompt = 'Your job is to infer output argument values in input data based on specification: {signature} {description}'; + protected string|Signature|HasSignature $defaultSignature; protected ?object $signatureCarrier; @@ -28,6 +35,12 @@ class Predict extends DynamicModule public function __construct( string|Signature|HasSignature $signature, Instructor $instructor, + string $model = 'gpt-4o', + int $maxRetries = 3, + array $options = [], + array $examples = [], + string $prompt = '', + Mode $mode = Mode::Tools, ) { if ($signature instanceof HasSignature) { $this->signatureCarrier = $signature; @@ -37,6 +50,12 @@ public function __construct( default => $signature, }; $this->instructor = $instructor; + $this->model = $model; + $this->maxRetries = $maxRetries; + $this->options = $options; + $this->examples = $examples; + $this->prompt = $prompt; + $this->mode = $mode; } public function signature(): string|Signature { @@ -75,8 +94,12 @@ public function forward(array $args, object $targetObject): mixed { $response = $this->instructor->respond( messages: $this->toMessages($input), responseModel: $targetObject, - model: 'gpt-4o', // TODO: needs to be configurable + model: $this->model, maxRetries: $this->maxRetries, + options: $this->options, + examples: $this->examples, + prompt: $this->prompt(), + mode: $this->mode, ); return $response; @@ -89,10 +112,6 @@ public function prompt() : string { return $this->prompt; } - public function setPrompt(string $prompt) : void { - $this->prompt = $prompt; - } - // INTERNAL //////////////////////////////////////////////////////////////////////////////////// private function toMessages(string|array|object $input) : array { diff --git a/src/Extras/Module/CallData/CallData.php b/src/Extras/Module/CallData/CallData.php index 313499fa..4e087133 100644 --- a/src/Extras/Module/CallData/CallData.php +++ b/src/Extras/Module/CallData/CallData.php @@ -1,28 +1,22 @@ signature = $signature; - $this->description = $signature->getDescription(); $this->input = new ObjectDataAccess($input, $signature->toInputSchema()->getPropertyNames()); $this->output = new ObjectDataAccess($output, $signature->toOutputSchema()->getPropertyNames()); } diff --git a/src/Extras/Module/CallData/SignatureData.php b/src/Extras/Module/CallData/SignatureData.php index e7a16253..56689485 100644 --- a/src/Extras/Module/CallData/SignatureData.php +++ b/src/Extras/Module/CallData/SignatureData.php @@ -2,8 +2,6 @@ namespace Cognesy\Instructor\Extras\Module\CallData; use Cognesy\Instructor\Contracts\CanProvideSchema; -use Cognesy\Instructor\Extras\Module\DataAccess\Contracts\DataAccess; -use Cognesy\Instructor\Extras\Module\Signature\Signature; use Cognesy\Instructor\Extras\Module\CallData\Contracts\HasInputOutputData; /** @@ -18,10 +16,6 @@ class SignatureData implements HasInputOutputData, CanProvideSchema { use Traits\CallDataClass\HandlesInputOutputData; - use Traits\CallDataClass\HandlesSchema; - use Traits\CallDataClass\HandlesSignature; - - private Signature $signature; - private DataAccess $input; - private DataAccess $output; + use Traits\CallDataClass\ProvidesSchema; + use Traits\CallDataClass\ProvidesSignature; } diff --git a/src/Extras/Module/CallData/Traits/AutoSignature.php b/src/Extras/Module/CallData/Traits/AutoSignature.php new file mode 100644 index 00000000..c01bbbc5 --- /dev/null +++ b/src/Extras/Module/CallData/Traits/AutoSignature.php @@ -0,0 +1,10 @@ +input->setValues( InputOutputMapper::fromInputs($args, $this->inputNames()) @@ -28,14 +33,4 @@ public function toArray(): array { $this->output->getValues(), ); } - - // CONVENIENCE METHODS //////////////////////////////////////////////////////////////// - - public function inputNames(): array { - return $this->signature->toInputSchema()->getPropertyNames(); - } - - public function outputNames(): array { - return $this->signature->toOutputSchema()->getPropertyNames(); - } } diff --git a/src/Extras/Module/CallData/Traits/CallData/ProvidesSchema.php b/src/Extras/Module/CallData/Traits/CallData/ProvidesSchema.php new file mode 100644 index 00000000..170c2585 --- /dev/null +++ b/src/Extras/Module/CallData/Traits/CallData/ProvidesSchema.php @@ -0,0 +1,30 @@ +toOutputSchema(); + } + + public function toInputSchema(): Schema { + return $this->signature()->toInputSchema(); + } + + public function toOutputSchema(): Schema { + return $this->signature()->toOutputSchema(); + } + + public function inputNames(): array { + return $this->toInputSchema()->getPropertyNames(); + } + + public function outputNames(): array { + return $this->toOutputSchema()->getPropertyNames(); + } +} \ No newline at end of file diff --git a/src/Extras/Module/CallData/Traits/CallData/HandlesSignature.php b/src/Extras/Module/CallData/Traits/CallData/ProvidesSignature.php similarity index 75% rename from src/Extras/Module/CallData/Traits/CallData/HandlesSignature.php rename to src/Extras/Module/CallData/Traits/CallData/ProvidesSignature.php index cd78babd..1bfcc6d1 100644 --- a/src/Extras/Module/CallData/Traits/CallData/HandlesSignature.php +++ b/src/Extras/Module/CallData/Traits/CallData/ProvidesSignature.php @@ -4,8 +4,10 @@ use Cognesy\Instructor\Extras\Module\Signature\Signature; -trait HandlesSignature +trait ProvidesSignature { + protected Signature $signature; + public function signature(): Signature { return $this->signature; } diff --git a/src/Extras/Module/CallData/Traits/CallDataClass/HandlesInputOutputData.php b/src/Extras/Module/CallData/Traits/CallDataClass/HandlesInputOutputData.php index b04af2a6..a6a7845b 100644 --- a/src/Extras/Module/CallData/Traits/CallDataClass/HandlesInputOutputData.php +++ b/src/Extras/Module/CallData/Traits/CallDataClass/HandlesInputOutputData.php @@ -8,6 +8,11 @@ trait HandlesInputOutputData { + use ProvidesSchema; + + private DataAccess $input; + private DataAccess $output; + static public function fromArgs(...$args): static { $instance = new static(); $instance->withArgs(...$args); @@ -41,14 +46,4 @@ public function toArray(): array { $this->output()->getValues(), ); } - - // CONVENIENCE METHODS //////////////////////////////////////////////////////////////// - - public function inputNames(): array { - return $this->signature()->toInputSchema()->getPropertyNames(); - } - - public function outputNames(): array { - return $this->signature()->toOutputSchema()->getPropertyNames(); - } } diff --git a/src/Extras/Module/CallData/Traits/CallDataClass/HandlesSchema.php b/src/Extras/Module/CallData/Traits/CallDataClass/HandlesSchema.php deleted file mode 100644 index 6758a117..00000000 --- a/src/Extras/Module/CallData/Traits/CallDataClass/HandlesSchema.php +++ /dev/null @@ -1,12 +0,0 @@ -signature()->toOutputSchema(); - } -} \ No newline at end of file diff --git a/src/Extras/Module/CallData/Traits/CallDataClass/ProvidesSchema.php b/src/Extras/Module/CallData/Traits/CallDataClass/ProvidesSchema.php new file mode 100644 index 00000000..0496d16b --- /dev/null +++ b/src/Extras/Module/CallData/Traits/CallDataClass/ProvidesSchema.php @@ -0,0 +1,30 @@ +toOutputSchema(); + } + + public function toInputSchema(): Schema { + return $this->signature()->toInputSchema(); + } + + public function toOutputSchema(): Schema { + return $this->signature()->toOutputSchema(); + } + + public function inputNames(): array { + return $this->toInputSchema()->getPropertyNames(); + } + + public function outputNames(): array { + return $this->toOutputSchema()->getPropertyNames(); + } +} diff --git a/src/Extras/Module/CallData/Traits/CallDataClass/HandlesSignature.php b/src/Extras/Module/CallData/Traits/CallDataClass/ProvidesSignature.php similarity index 84% rename from src/Extras/Module/CallData/Traits/CallDataClass/HandlesSignature.php rename to src/Extras/Module/CallData/Traits/CallDataClass/ProvidesSignature.php index 71f6a914..086cfab2 100644 --- a/src/Extras/Module/CallData/Traits/CallDataClass/HandlesSignature.php +++ b/src/Extras/Module/CallData/Traits/CallDataClass/ProvidesSignature.php @@ -5,8 +5,10 @@ use Cognesy\Instructor\Extras\Module\Signature\Signature; use Cognesy\Instructor\Extras\Module\Signature\SignatureFactory; -trait HandlesSignature +trait ProvidesSignature { + private Signature $signature; + public function signature(): Signature { if (!isset($this->signature)) { $this->signature = SignatureFactory::fromClassMetadata(static::class);