* } */ class OllamaModelMetadataDirectory extends AbstractOpenAiCompatibleModelMetadataDirectory { /** * {@inheritDoc} * * @since 0.1.0 */ protected function createRequest(HttpMethodEnum $method, string $path, array $headers = [], $data = null): Request { return new Request( $method, OllamaProvider::url($path), $headers, $data ); } /** * {@inheritDoc} * * @since 0.1.0 */ protected function parseResponseToModelMetadataList(Response $response): array { /** @var ModelsResponseData $responseData */ $responseData = $response->getData(); if (!isset($responseData['data']) || !$responseData['data']) { throw ResponseException::fromMissingData('Ollama', 'data'); } $textCapabilities = [ CapabilityEnum::textGeneration(), CapabilityEnum::chatHistory(), ]; $textOptions = [ new SupportedOption(OptionEnum::systemInstruction()), new SupportedOption(OptionEnum::candidateCount()), new SupportedOption(OptionEnum::maxTokens()), new SupportedOption(OptionEnum::temperature()), new SupportedOption(OptionEnum::topP()), new SupportedOption(OptionEnum::stopSequences()), new SupportedOption(OptionEnum::outputMimeType(), ['text/plain', 'application/json']), new SupportedOption(OptionEnum::outputSchema()), new SupportedOption(OptionEnum::functionDeclarations()), new SupportedOption(OptionEnum::customOptions()), new SupportedOption(OptionEnum::inputModalities(), [[ModalityEnum::text()]]), new SupportedOption(OptionEnum::outputModalities(), [[ModalityEnum::text()]]), ]; $models = array_values( array_map( static function (array $modelData) use ($textCapabilities, $textOptions): ModelMetadata { $modelId = $modelData['id']; return new ModelMetadata( $modelId, $modelId, $textCapabilities, $textOptions ); }, (array) $responseData['data'] ) ); usort( $models, static function (ModelMetadata $a, ModelMetadata $b): int { return strcmp($a->getId(), $b->getId()); } ); return $models; } }