* } */ class GitHubModelsModelMetadataDirectory extends AbstractApiBasedModelMetadataDirectory { /** * {@inheritDoc} * * @since 1.0.0 * * @return array * @throws ResponseException When the response is unsuccessful or missing data. */ protected function sendListModelsRequest(): array { $request = $this->createRequest( HttpMethodEnum::GET(), 'v1/models' ); $request = $this->getRequestAuthentication()->authenticateRequest( $request ); $response = $this->getHttpTransporter()->send( $request ); ResponseUtil::throwIfNotSuccessful( $response ); $models_data = $response->getData(); if ( ! isset( $models_data['data'] ) ) { throw ResponseException::fromMissingData( 'GitHub Models', 'data' ); } $models_map = []; foreach ( $models_data['data'] as $model_entry ) { $model_id = $model_entry['id']; $metadata = $this->buildModelMetadata( $model_id ); if ( null === $metadata ) { continue; } $models_map[ $model_id ] = $metadata; } ksort( $models_map ); return $models_map; } /** * Builds a ModelMetadata object for a single model. * * No model details endpoint is available, so all listed models * are treated as text generation models without vision support. * * @since 1.0.0 * * @param string $model_id The model identifier. * @return \WordPress\AiClient\Providers\Models\DTO\ModelMetadata|null The model metadata. */ private function buildModelMetadata( string $model_id ): ?ModelMetadata { $input_modalities_option = new SupportedOption( OptionEnum::inputModalities(), [ [ ModalityEnum::text() ] ] ); $options = [ 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::frequencyPenalty() ), new SupportedOption( OptionEnum::presencePenalty() ), new SupportedOption( OptionEnum::outputMimeType(), [ 'text/plain', 'application/json' ] ), new SupportedOption( OptionEnum::outputSchema() ), new SupportedOption( OptionEnum::functionDeclarations() ), new SupportedOption( OptionEnum::customOptions() ), new SupportedOption( OptionEnum::outputModalities(), [ [ ModalityEnum::text() ] ] ), $input_modalities_option, ]; return new ModelMetadata( $model_id, $model_id, [ CapabilityEnum::textGeneration(), CapabilityEnum::chatHistory(), ], $options ); } /** * Creates a request object for the API. * * @since 1.0.0 * * @param \WordPress\AiClient\Providers\Http\Enums\HttpMethodEnum $method The HTTP method. * @param string $path The API endpoint path, relative to the base URI. * @param array> $headers The request headers. * @param string|array|null $data The request data. * @return \WordPress\AiClient\Providers\Http\DTO\Request The request object. */ private function createRequest( HttpMethodEnum $method, string $path, array $headers = [], $data = null ): Request { return new Request( $method, GitHubModelsProvider::url( $path ), $headers, $data ); } }