def prompt_api_key(self): api = Api() key = apikey.prompt_api_key( self._settings, api=api, no_offline=self._settings.force, no_create=self._settings.force, ) if key is False: raise UsageError( "api_key not configured (no-tty). Run wandb login") self.update_session(key) self._key = key
def _login( anonymous=None, key=None, relogin=None, force=None, host=None, _backend=None, _disable_warning=None, _settings=None, ): """Log in to W&B. Args: settings (dict, optional): Override settings. relogin (bool, optional): If true, will re-prompt for API key. host (string, optional): The host to connect to anonymous (string, optional): Can be "must", "allow", or "never". If set to "must" we'll always login anonymously, if set to "allow" we'll only create an anonymous user if the user isn't already logged in. Returns: bool: if key is configured Raises: UsageError - if api_key can not configured and no tty """ if wandb.run is not None: if not _disable_warning: wandb.termwarn( "Calling wandb.login() after wandb.init() is a no-op.") return True settings_dict = {} api = Api() if anonymous is not None: # TODO: Move this check into wandb_settings probably. if not _validate_anonymous_setting(anonymous): wandb.termwarn( "Invalid value passed for argument `anonymous` to " "wandb.login(). Can be 'must', 'allow', or 'never'.") return False settings_dict.update({"anonymous": anonymous}) if host is not None: settings_dict.update({"base_url": host}) if key: settings_dict.update({"api_key": key}) # Note: This won't actually do anything if called from a codepath where # wandb.setup was previously called. If wandb.setup is called further up, # you must make sure the anonymous setting (and any other settings) are # already properly set up there. wl = wandb.setup(settings=wandb.Settings(**settings_dict)) wl_settings = wl.settings() if _settings: wl_settings._apply_settings(settings=_settings) settings = wl_settings if settings._offline: return False active_entity = None logged_in = is_logged_in(settings=settings) if logged_in: # TODO: do we want to move all login logic to the backend? if _backend: res = _backend.interface.communicate_login(key, anonymous) active_entity = res.active_entity else: active_entity = wl._get_entity() if active_entity and not relogin: login_state_str = "Currently logged in as:" login_info_str = "(use `wandb login --relogin` to force relogin)" wandb.termlog( "{} {} {}".format(login_state_str, click.style(active_entity, fg="yellow"), login_info_str), repeat=False, ) return True jupyter = settings._jupyter or False if key: if jupyter: wandb.termwarn( ("If you're specifying your api key in code, ensure this " "code is not shared publically.\nConsider setting the " "WANDB_API_KEY environment variable, or running " "`wandb login` from the command line.")) apikey.write_key(settings, key) else: key = apikey.prompt_api_key(settings, api=api, no_offline=force, no_create=force) if key is False: raise UsageError( "api_key not configured (no-tty). Run wandb login") if _backend and not logged_in: # TODO: calling this twice is gross, this deserves a refactor # Make sure our backend picks up the new creds _ = _backend.interface.communicate_login(key, anonymous) return key or False
class Api(object): """Internal proxy to the official internal API. Eventually these methods should likely be moved to PublicApi""" def __init__(self, *args, **kwargs): self.api = InternalApi(*args, **kwargs) @property def api_key(self): return self.api.api_key @property def api_url(self): return self.api.api_url @property def app_url(self): return self.api.app_url @property def git(self): return self.api.git def file_current(self, *args): return self.api.file_current(*args) def download_file(self, *args, **kwargs): return self.api.download_file(*args, **kwargs) def set_current_run_id(self, run_id): return self.api.set_current_run_id(run_id) def viewer(self): return self.api.viewer() def list_projects(self, entity=None): return self.api.list_projects(entity=entity) def format_project(self, project): return self.api.format_project(project) def upsert_project(self, project, id=None, description=None, entity=None): return self.api.upsert_project(project, id=id, description=description, entity=entity) def settings(self, *args, **kwargs): return self.api.settings(*args, **kwargs) def clear_setting(self, *args, **kwargs): return self.api.clear_setting(*args, **kwargs) def set_setting(self, *args, **kwargs): return self.api.set_setting(*args, **kwargs) def parse_slug(self, *args, **kwargs): return self.api.parse_slug(*args, **kwargs) def download_urls(self, *args, **kwargs): return self.api.download_urls(*args, **kwargs) def create_anonymous_api_key(self): return self.api.create_anonymous_api_key() def sweep(self, *args, **kwargs): return self.api.sweep(*args, **kwargs) def upsert_sweep(self, *args, **kwargs): return self.api.upsert_sweep(*args, **kwargs) def register_agent(self, *args, **kwargs): return self.api.register_agent(*args, **kwargs) def agent_heartbeat(self, *args, **kwargs): return self.api.agent_heartbeat(*args, **kwargs) def use_artifact(self, *args, **kwargs): return self.api.use_artifact(*args, **kwargs) def create_artifact(self, *args, **kwargs): return self.api.create_artifact(*args, **kwargs)
def __init__(self, *args, **kwargs): self.api = InternalApi(*args, **kwargs)
def login(backend=None, relogin=None, key=None, anonymous=None): """Log in to W&B. Args: settings (dict, optional): Override settings. relogin (bool, optional): If true, will re-prompt for API key. anonymous (string, optional): Can be "must", "allow", or "never". If set to "must" we'll always login anonymously, if set to "allow" we'll only create an anonymous user if the user isn't already logged in. Returns: None """ if wandb.run is not None: wandb.termwarn("Calling wandb.login() after wandb.init() is a no-op.") return settings = {} api = Api() if anonymous is not None: # TODO: Move this check into wandb_settings probably. if not _validate_anonymous_setting(anonymous): wandb.termwarn( "Invalid value passed for argument `anonymous` to " "wandb.login(). Can be 'must', 'allow', or 'never'." ) return settings.update({"anonymous": anonymous}) # Note: This won't actually do anything if called from a codepath where # wandb.setup was previously called. If wandb.setup is called further up, # you must make sure the anonymous setting (and any other settings) are # already properly set up there. wl = wandb.setup(settings=settings, _warn=False) settings = wl.settings() active_entity = None if is_logged_in(): # TODO: do we want to move all login logic to the backend? if backend: res = backend.interface.send_login_sync(key, anonymous) active_entity = res.active_entity else: active_entity = wl._get_entity() if active_entity and not relogin: login_state_str = "Currently logged in as:" login_info_str = "(use `wandb login --relogin` to force relogin)" wandb.termlog( "{} {} {}".format( login_state_str, click.style(active_entity, fg="yellow"), login_info_str ) ) return jupyter = settings.jupyter or False if key: if jupyter: wandb.termwarn( ( "If you're specifying your api key in code, ensure this " "code is not shared publically.\nConsider setting the " "WANDB_API_KEY environment variable, or running " "`wandb login` from the command line." ) ) apikey.write_key(settings, key) else: apikey.prompt_api_key(settings, api=api) return