<?php
require 'examples/boot.php';
use Cognesy\Instructor\StructuredOutput;
enum Emotion: string { case Happy='Happy'; case Angry='Angry'; case Sadness='Sadness'; }
enum Confidence: string { case Uncertain='Uncertain'; case Somewhat='Somewhat Confident'; case Confident='Confident'; case Highly='Highly Confident'; }
class Classification { public string $chain_of_thought; public Emotion $label; public Confidence $confidence; }
class USPClassification {
public function classify(string $query) : Classification {
$content = 'Classify the following query into one of: Happy, Angry, Sadness';
return (new StructuredOutput)->with(
messages: [ ['role'=>'system','content'=>$content], ['role'=>'user','content'=>$query] ],
responseModel: Classification::class,
)->get();
}
public function balancedSample(array $queries, int $k) : array {
$preds = [];
foreach ($queries as $q) { $preds[] = [$this->classify($q), $q]; }
$by = [];
foreach ($preds as $p) { $by[$p[0]->label->value][] = $p; }
$per = max(1, intdiv($k, max(1, count($by))));
$out = [];
foreach ($by as $label => $items) {
usort($items, fn($a,$b) => $this->score($b[0]->confidence) <=> $this->score($a[0]->confidence));
$slice = array_slice($items, 0, $per);
foreach ($slice as $it) { $out[] = $it[1] . " ({$label})"; }
}
return $out;
}
public function finalWithExamples(string $query, array $examples) : Classification {
$formatted = implode("\n", $examples);
$system = "You classify queries into Happy, Angry, or Sadness.\n<examples>\n{$formatted}\n</examples>";
return (new StructuredOutput)->with(
messages: [ ['role'=>'system','content'=>$system], ['role'=>'user','content'=>$query] ],
responseModel: Classification::class,
)->get();
}
private function score(Confidence $c) : int {
return match($c) { Confidence::Highly => 4, Confidence::Confident => 3, Confidence::Somewhat => 2, Confidence::Uncertain => 1 };
}
}
?>