code: def submit_job(
      self,
      run_spec: RunSpec,
      job_spec: JobSpec,
      secrets: Dict[str, str],
      repo_credentials: Optional[RemoteRepoCreds],
  ):
      body = SubmitBody(
          run_spec=run_spec,
          job_spec=job_spec,
          secrets=secrets,
          repo_credentials=repo_credentials,
      )
      resp = requests.post(
          # use .json() to encode enums
          self._url("/api/submit"),
          data=body.json(),
          headers={"Content-Type": "application/json"},
      )
      resp.raise_for_status()
  
imports: import asyncio
  import weakref
  from typing import BinaryIO, Dict, Optional, Union
  import aiohttp
  import requests
  import requests.exceptions
  from dstack._internal.core.models.repos.remote import RemoteRepoCreds
  from dstack._internal.core.models.runs import JobSpec, RunSpec
  from dstack._internal.server.schemas.runner import HealthcheckResponse, PullResponse, RegistryAuthBody, SubmitBody
label_desc: Use image node_id 3 for calling the RunnerClient obj's underlying member method code with example usage: obj.submit_job(run_spec, job_spec, secrets, repo_credentials) without return types