403 ) ); } /** * What the UI may know about the key (never the key). * * @return array */ public static function state(): array { $settings = KeyStore::settings(); return array( 'active' => KeyStore::active(), 'provider' => $settings['provider'], 'model' => $settings['model'], // Last 4 characters: administrators only (the chat's /status is open to every user of the assistant). 'hint' => OwnKeySection::can_manage() ? KeyStore::hint() : '', 'constant' => '' !== $settings['provider'] && KeyStore::from_constant( $settings['provider'] ), 'step_mode' => KeyStore::step_mode(), 'can_manage' => OwnKeySection::can_manage(), ); } /** * Save and test. * * @param WP_REST_Request $request Request. * @return WP_REST_Response|WP_Error */ public function save( WP_REST_Request $request ) { $provider = sanitize_key( (string) $request['provider'] ); $model = KeyStore::clean_model( sanitize_text_field( (string) $request['model'] ) ); // Opaque secret (like a password): not sanitize_text_field; trimmed and checked against the key alphabet. $key = trim( (string) $request['key'] ); if ( '' !== $key && ! KeyStore::valid_key( $key ) ) { return new WP_Error( 'addsynapse_assistant_ai_key_invalid', __( 'This does not look like an API key.', 'addsynapse-store-assistant' ), array( 'status' => 400 ) ); } if ( ! KeyStore::save( $provider, $model, '' !== $key ? $key : null ) ) { return new WP_Error( 'addsynapse_assistant_ai_key_invalid', __( 'Choose a provider and one of its models (a model of the other provider cannot be used).', 'addsynapse-store-assistant' ), array( 'status' => 400 ) ); } $result = ( new DirectClient() )->test( $provider, KeyStore::model(), KeyStore::key( $provider ) ); if ( true !== $result ) { return new WP_Error( 'addsynapse_assistant_ai_key_test_failed', ErrorMessages::for_code( $result->get_error_code(), $result->getMessage() ), array( 'status' => 400 ) ); } KeyStore::mark_tested(); return new WP_REST_Response( self::state() ); } /** * Remove. */ public function delete(): WP_REST_Response { KeyStore::delete(); return new WP_REST_Response( self::state() ); } }