$attributeFields Attribute names defined for this article type * * @return array{specsText: string, correctedModelNumber: string} */ public function research(string $modelName, string $articleTypeName, string $manufacturer = '', array $attributeFields = []): array { $subject = trim(($manufacturer !== '' ? $manufacturer.' ' : '').$modelName); $searchResults = $this->search->search("{$subject} {$articleTypeName} specifications"); $fieldsList = [] !== $attributeFields ? implode("\n", array_map(static fn (string $f) => "- {$f}", $attributeFields)) : '- all relevant technical specifications'; $prompt = $this->prompts->render('specs_research', [ 'articleType' => $articleTypeName, 'subject' => $subject, 'searchResults' => $searchResults !== '' ? $searchResults : 'No web results available.', 'fields' => $fieldsList, ]); $result = $this->client->generate($this->model, $prompt); if ('' === trim($result)) { throw new \RuntimeException("No specifications found for model: {$modelName}"); } return $this->parseResponse($result); } /** @return array{specsText: string, correctedModelNumber: string} */ private function parseResponse(string $raw): array { $correctedModelNumber = ''; if (preg_match('/^CORRECTED_MODEL_NUMBER:\s*(\S+)/m', $raw, $matches)) { $correctedModelNumber = trim($matches[1]); // Strip the line from the specs text $raw = preg_replace('/^CORRECTED_MODEL_NUMBER:[^\n]*\n?/m', '', $raw) ?? $raw; } return [ 'specsText' => trim($raw), 'correctedModelNumber' => $correctedModelNumber, ]; } }