We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Text/link displayed after calling run_pipeline should be "Run link" not "Job link" 
Here: https://github.com/kubeflow/pipelines/blob/master/sdk/python/kfp/_client.py#L153

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `sdk/python/kfp/_client.py`
Content:
```
1 # Copyright 2018 Google LLC
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 
16 import six
17 import time
18 import logging
19 import json
20 import os
21 import tarfile
22 import yaml
23 from datetime import datetime
24 
25 
26 class Client(object):
27   """ API Client for KubeFlow Pipeline.
28   """
29 
30   def __init__(self, host='ml-pipeline.kubeflow.svc.cluster.local:8888'):
31     """Create a new instance of kfp client.
32 
33     Args:
34       host: the API host. If running inside the cluster as a Pod, default value should work.
35     """
36 
37     try:
38       import kfp_experiment
39     except ImportError:
40       raise Exception('This module requires installation of kfp_experiment')
41 
42     try:
43       import kfp_run
44     except ImportError:
45       raise Exception('This module requires installation of kfp_run')
46 
47     config = kfp_run.configuration.Configuration()
48     config.host = host
49     api_client = kfp_run.api_client.ApiClient(config)
50     self._run_api = kfp_run.api.run_service_api.RunServiceApi(api_client)
51 
52     config = kfp_experiment.configuration.Configuration()
53     config.host = host
54     api_client = kfp_experiment.api_client.ApiClient(config)
55     self._experiment_api = \
56         kfp_experiment.api.experiment_service_api.ExperimentServiceApi(api_client)
57 
58   def _is_ipython(self):
59     """Returns whether we are running in notebook."""
60     try:
61       import IPython
62     except ImportError:
63       return False
64 
65     return True
66 
67   def create_experiment(self, name):
68     """Create a new experiment.
69     Args:
70       name: the name of the experiment.
71     Returns:
72       An Experiment object. Most important field is id.
73     """
74     import kfp_experiment
75 
76     exp = kfp_experiment.models.ApiExperiment(name=name)
77     response = self._experiment_api.create_experiment(body=exp)
78     
79     if self._is_ipython():
80       import IPython
81       html = \
82           ('Experiment link <a href="/pipeline/#/experiments/details/%s" target="_blank" >here</a>'
83           % response.id)
84       IPython.display.display(IPython.display.HTML(html))
85     return response
86 
87   def list_experiments(self, page_token='', page_size=10, sort_by=''):
88     """List experiments.
89     Args:
90       page_token: token for starting of the page.
91       page_size: size of the page.
92       sort_by: can be '[field_name]', '[field_name] des'. For example, 'name des'.
93     Returns:
94       A response object including a list of experiments and next page token.
95     """
96     response = self._experiment_api.list_experiment(
97         page_token=page_token, page_size=page_size, sort_by=sort_by)
98     return response
99 
100   def get_experiment(self, experiment_id):
101     """Get details of an experiment
102     Args:
103       id of the experiment.
104     Returns:
105       A response object including details of a experiment.
106     Throws:
107       Exception if experiment is not found.        
108     """
109     return self._experiment_api.get_experiment(id=experiment_id)
110 
111   def _extract_pipeline_yaml(self, tar_file):
112     with tarfile.open(tar_file, "r:gz") as tar:
113       all_yaml_files = [m for m in tar if m.isfile() and 
114           (os.path.splitext(m.name)[-1] == '.yaml' or os.path.splitext(m.name)[-1] == '.yml')]
115       if len(all_yaml_files) == 0:
116         raise ValueError('Invalid package. Missing pipeline yaml file in the package.')
117         
118       if len(all_yaml_files) > 1:
119         raise ValueError('Invalid package. Multiple yaml files in the package.')
120         
121       with tar.extractfile(all_yaml_files[0]) as f:
122         return yaml.load(f)
123 
124   def run_pipeline(self, experiment_id, job_name, pipeline_package_path, params={}):
125     """Run a specified pipeline.
126 
127     Args:
128       experiment_id: The string id of an experiment.
129       job_name: name of the job.
130       pipeline_package_path: local path of the pipeline package(tar.gz file).
131       params: a dictionary with key (string) as param name and value (string) as as param value.
132 
133     Returns:
134       A run object. Most important field is id.
135     """
136     import kfp_run
137 
138     pipeline_obj = self._extract_pipeline_yaml(pipeline_package_path)
139     pipeline_json_string = json.dumps(pipeline_obj)
140     api_params = [kfp_run.ApiParameter(name=k, value=str(v)) for k,v in six.iteritems(params)]
141     key = kfp_run.models.ApiResourceKey(id=experiment_id,
142                                         type=kfp_run.models.ApiResourceType.EXPERIMENT)
143     reference = kfp_run.models.ApiResourceReference(key, kfp_run.models.ApiRelationship.OWNER)
144     spec = kfp_run.models.ApiPipelineSpec(
145         workflow_manifest=pipeline_json_string, parameters=api_params)
146     run_body = kfp_run.models.ApiRun(
147         pipeline_spec=spec, resource_references=[reference], name=job_name)
148 
149     response = self._run_api.create_run(body=run_body)
150     
151     if self._is_ipython():
152       import IPython
153       html = ('Job link <a href="/pipeline/#/runs/details/%s" target="_blank" >here</a>'
154               % response.run.id)
155       IPython.display.display(IPython.display.HTML(html))
156     return response.run
157 
158   def list_runs(self, page_token='', page_size=10, sort_by=''):
159     """List runs.
160     Args:
161       page_token: token for starting of the page.
162       page_size: size of the page.
163       sort_by: one of 'field_name', 'field_name des'. For example, 'name des'.
164     Returns:
165       A response object including a list of experiments and next page token.
166     """
167     response = self._run_api.list_runs(page_token=page_token, page_size=page_size, sort_by=sort_by)
168     return response
169 
170   def get_run(self, run_id):
171     """Get run details.
172     Args:
173       id of the run.
174     Returns:
175       A response object including details of a run.
176     Throws:
177       Exception if run is not found.
178     """
179     return self._run_api.get_run(run_id=run_id)
180 
181   def wait_for_run_completion(self, run_id, timeout):
182     """Wait for a run to complete.
183     Args:
184       run_id: run id, returned from run_pipeline.
185       timeout: timeout in seconds.
186     Returns:
187       A run detail object: Most important fields are run and pipeline_runtime
188     """
189     status = 'Running:'
190     start_time = datetime.now()
191     while status is None or status.lower() not in ['succeeded', 'failed', 'skipped', 'error']:
192       get_run_response = self._run_api.get_run(run_id=run_id)
193       status = get_run_response.run.status
194       elapsed_time = (datetime.now() - start_time).seconds
195       logging.info('Waiting for the job to complete...')
196       if elapsed_time > timeout:
197         raise TimeoutError('Run timeout')
198       time.sleep(5)
199     return get_run_response
200 
201   def _get_workflow_json(self, run_id):
202     """Get the workflow json.
203     Args:
204       run_id: run id, returned from run_pipeline.
205     Returns:
206       workflow: json workflow
207     """
208     get_run_response = self._run_api.get_run(run_id=run_id)
209     workflow = get_run_response.pipeline_runtime.workflow_manifest
210     workflow_json = json.loads(workflow)
211     return workflow_json
212
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/sdk/python/kfp/_client.py b/sdk/python/kfp/_client.py
--- a/sdk/python/kfp/_client.py
+++ b/sdk/python/kfp/_client.py
@@ -150,7 +150,7 @@
     
     if self._is_ipython():
       import IPython
-      html = ('Job link <a href="/pipeline/#/runs/details/%s" target="_blank" >here</a>'
+      html = ('Run link <a href="/pipeline/#/runs/details/%s" target="_blank" >here</a>'
               % response.run.id)
       IPython.display.display(IPython.display.HTML(html))
     return response.run

{"golden_diff": "diff --git a/sdk/python/kfp/_client.py b/sdk/python/kfp/_client.py\n--- a/sdk/python/kfp/_client.py\n+++ b/sdk/python/kfp/_client.py\n@@ -150,7 +150,7 @@\n     \n     if self._is_ipython():\n       import IPython\n-      html = ('Job link <a href=\"/pipeline/#/runs/details/%s\" target=\"_blank\" >here</a>'\n+      html = ('Run link <a href=\"/pipeline/#/runs/details/%s\" target=\"_blank\" >here</a>'\n               % response.run.id)\n       IPython.display.display(IPython.display.HTML(html))\n     return response.run\n", "issue": "Text/link displayed after calling run_pipeline should be \"Run link\" not \"Job link\" \nHere: https://github.com/kubeflow/pipelines/blob/master/sdk/python/kfp/_client.py#L153\n", "before_files": [{"content": "# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\nimport six\nimport time\nimport logging\nimport json\nimport os\nimport tarfile\nimport yaml\nfrom datetime import datetime\n\n\nclass Client(object):\n  \"\"\" API Client for KubeFlow Pipeline.\n  \"\"\"\n\n  def __init__(self, host='ml-pipeline.kubeflow.svc.cluster.local:8888'):\n    \"\"\"Create a new instance of kfp client.\n\n    Args:\n      host: the API host. If running inside the cluster as a Pod, default value should work.\n    \"\"\"\n\n    try:\n      import kfp_experiment\n    except ImportError:\n      raise Exception('This module requires installation of kfp_experiment')\n\n    try:\n      import kfp_run\n    except ImportError:\n      raise Exception('This module requires installation of kfp_run')\n\n    config = kfp_run.configuration.Configuration()\n    config.host = host\n    api_client = kfp_run.api_client.ApiClient(config)\n    self._run_api = kfp_run.api.run_service_api.RunServiceApi(api_client)\n\n    config = kfp_experiment.configuration.Configuration()\n    config.host = host\n    api_client = kfp_experiment.api_client.ApiClient(config)\n    self._experiment_api = \\\n        kfp_experiment.api.experiment_service_api.ExperimentServiceApi(api_client)\n\n  def _is_ipython(self):\n    \"\"\"Returns whether we are running in notebook.\"\"\"\n    try:\n      import IPython\n    except ImportError:\n      return False\n\n    return True\n\n  def create_experiment(self, name):\n    \"\"\"Create a new experiment.\n    Args:\n      name: the name of the experiment.\n    Returns:\n      An Experiment object. Most important field is id.\n    \"\"\"\n    import kfp_experiment\n\n    exp = kfp_experiment.models.ApiExperiment(name=name)\n    response = self._experiment_api.create_experiment(body=exp)\n    \n    if self._is_ipython():\n      import IPython\n      html = \\\n          ('Experiment link <a href=\"/pipeline/#/experiments/details/%s\" target=\"_blank\" >here</a>'\n          % response.id)\n      IPython.display.display(IPython.display.HTML(html))\n    return response\n\n  def list_experiments(self, page_token='', page_size=10, sort_by=''):\n    \"\"\"List experiments.\n    Args:\n      page_token: token for starting of the page.\n      page_size: size of the page.\n      sort_by: can be '[field_name]', '[field_name] des'. For example, 'name des'.\n    Returns:\n      A response object including a list of experiments and next page token.\n    \"\"\"\n    response = self._experiment_api.list_experiment(\n        page_token=page_token, page_size=page_size, sort_by=sort_by)\n    return response\n\n  def get_experiment(self, experiment_id):\n    \"\"\"Get details of an experiment\n    Args:\n      id of the experiment.\n    Returns:\n      A response object including details of a experiment.\n    Throws:\n      Exception if experiment is not found.        \n    \"\"\"\n    return self._experiment_api.get_experiment(id=experiment_id)\n\n  def _extract_pipeline_yaml(self, tar_file):\n    with tarfile.open(tar_file, \"r:gz\") as tar:\n      all_yaml_files = [m for m in tar if m.isfile() and \n          (os.path.splitext(m.name)[-1] == '.yaml' or os.path.splitext(m.name)[-1] == '.yml')]\n      if len(all_yaml_files) == 0:\n        raise ValueError('Invalid package. Missing pipeline yaml file in the package.')\n        \n      if len(all_yaml_files) > 1:\n        raise ValueError('Invalid package. Multiple yaml files in the package.')\n        \n      with tar.extractfile(all_yaml_files[0]) as f:\n        return yaml.load(f)\n\n  def run_pipeline(self, experiment_id, job_name, pipeline_package_path, params={}):\n    \"\"\"Run a specified pipeline.\n\n    Args:\n      experiment_id: The string id of an experiment.\n      job_name: name of the job.\n      pipeline_package_path: local path of the pipeline package(tar.gz file).\n      params: a dictionary with key (string) as param name and value (string) as as param value.\n\n    Returns:\n      A run object. Most important field is id.\n    \"\"\"\n    import kfp_run\n\n    pipeline_obj = self._extract_pipeline_yaml(pipeline_package_path)\n    pipeline_json_string = json.dumps(pipeline_obj)\n    api_params = [kfp_run.ApiParameter(name=k, value=str(v)) for k,v in six.iteritems(params)]\n    key = kfp_run.models.ApiResourceKey(id=experiment_id,\n                                        type=kfp_run.models.ApiResourceType.EXPERIMENT)\n    reference = kfp_run.models.ApiResourceReference(key, kfp_run.models.ApiRelationship.OWNER)\n    spec = kfp_run.models.ApiPipelineSpec(\n        workflow_manifest=pipeline_json_string, parameters=api_params)\n    run_body = kfp_run.models.ApiRun(\n        pipeline_spec=spec, resource_references=[reference], name=job_name)\n\n    response = self._run_api.create_run(body=run_body)\n    \n    if self._is_ipython():\n      import IPython\n      html = ('Job link <a href=\"/pipeline/#/runs/details/%s\" target=\"_blank\" >here</a>'\n              % response.run.id)\n      IPython.display.display(IPython.display.HTML(html))\n    return response.run\n\n  def list_runs(self, page_token='', page_size=10, sort_by=''):\n    \"\"\"List runs.\n    Args:\n      page_token: token for starting of the page.\n      page_size: size of the page.\n      sort_by: one of 'field_name', 'field_name des'. For example, 'name des'.\n    Returns:\n      A response object including a list of experiments and next page token.\n    \"\"\"\n    response = self._run_api.list_runs(page_token=page_token, page_size=page_size, sort_by=sort_by)\n    return response\n\n  def get_run(self, run_id):\n    \"\"\"Get run details.\n    Args:\n      id of the run.\n    Returns:\n      A response object including details of a run.\n    Throws:\n      Exception if run is not found.\n    \"\"\"\n    return self._run_api.get_run(run_id=run_id)\n\n  def wait_for_run_completion(self, run_id, timeout):\n    \"\"\"Wait for a run to complete.\n    Args:\n      run_id: run id, returned from run_pipeline.\n      timeout: timeout in seconds.\n    Returns:\n      A run detail object: Most important fields are run and pipeline_runtime\n    \"\"\"\n    status = 'Running:'\n    start_time = datetime.now()\n    while status is None or status.lower() not in ['succeeded', 'failed', 'skipped', 'error']:\n      get_run_response = self._run_api.get_run(run_id=run_id)\n      status = get_run_response.run.status\n      elapsed_time = (datetime.now() - start_time).seconds\n      logging.info('Waiting for the job to complete...')\n      if elapsed_time > timeout:\n        raise TimeoutError('Run timeout')\n      time.sleep(5)\n    return get_run_response\n\n  def _get_workflow_json(self, run_id):\n    \"\"\"Get the workflow json.\n    Args:\n      run_id: run id, returned from run_pipeline.\n    Returns:\n      workflow: json workflow\n    \"\"\"\n    get_run_response = self._run_api.get_run(run_id=run_id)\n    workflow = get_run_response.pipeline_runtime.workflow_manifest\n    workflow_json = json.loads(workflow)\n    return workflow_json\n", "path": "sdk/python/kfp/_client.py"}], "after_files": [{"content": "# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\nimport six\nimport time\nimport logging\nimport json\nimport os\nimport tarfile\nimport yaml\nfrom datetime import datetime\n\n\nclass Client(object):\n  \"\"\" API Client for KubeFlow Pipeline.\n  \"\"\"\n\n  def __init__(self, host='ml-pipeline.kubeflow.svc.cluster.local:8888'):\n    \"\"\"Create a new instance of kfp client.\n\n    Args:\n      host: the API host. If running inside the cluster as a Pod, default value should work.\n    \"\"\"\n\n    try:\n      import kfp_experiment\n    except ImportError:\n      raise Exception('This module requires installation of kfp_experiment')\n\n    try:\n      import kfp_run\n    except ImportError:\n      raise Exception('This module requires installation of kfp_run')\n\n    config = kfp_run.configuration.Configuration()\n    config.host = host\n    api_client = kfp_run.api_client.ApiClient(config)\n    self._run_api = kfp_run.api.run_service_api.RunServiceApi(api_client)\n\n    config = kfp_experiment.configuration.Configuration()\n    config.host = host\n    api_client = kfp_experiment.api_client.ApiClient(config)\n    self._experiment_api = \\\n        kfp_experiment.api.experiment_service_api.ExperimentServiceApi(api_client)\n\n  def _is_ipython(self):\n    \"\"\"Returns whether we are running in notebook.\"\"\"\n    try:\n      import IPython\n    except ImportError:\n      return False\n\n    return True\n\n  def create_experiment(self, name):\n    \"\"\"Create a new experiment.\n    Args:\n      name: the name of the experiment.\n    Returns:\n      An Experiment object. Most important field is id.\n    \"\"\"\n    import kfp_experiment\n\n    exp = kfp_experiment.models.ApiExperiment(name=name)\n    response = self._experiment_api.create_experiment(body=exp)\n    \n    if self._is_ipython():\n      import IPython\n      html = \\\n          ('Experiment link <a href=\"/pipeline/#/experiments/details/%s\" target=\"_blank\" >here</a>'\n          % response.id)\n      IPython.display.display(IPython.display.HTML(html))\n    return response\n\n  def list_experiments(self, page_token='', page_size=10, sort_by=''):\n    \"\"\"List experiments.\n    Args:\n      page_token: token for starting of the page.\n      page_size: size of the page.\n      sort_by: can be '[field_name]', '[field_name] des'. For example, 'name des'.\n    Returns:\n      A response object including a list of experiments and next page token.\n    \"\"\"\n    response = self._experiment_api.list_experiment(\n        page_token=page_token, page_size=page_size, sort_by=sort_by)\n    return response\n\n  def get_experiment(self, experiment_id):\n    \"\"\"Get details of an experiment\n    Args:\n      id of the experiment.\n    Returns:\n      A response object including details of a experiment.\n    Throws:\n      Exception if experiment is not found.        \n    \"\"\"\n    return self._experiment_api.get_experiment(id=experiment_id)\n\n  def _extract_pipeline_yaml(self, tar_file):\n    with tarfile.open(tar_file, \"r:gz\") as tar:\n      all_yaml_files = [m for m in tar if m.isfile() and \n          (os.path.splitext(m.name)[-1] == '.yaml' or os.path.splitext(m.name)[-1] == '.yml')]\n      if len(all_yaml_files) == 0:\n        raise ValueError('Invalid package. Missing pipeline yaml file in the package.')\n        \n      if len(all_yaml_files) > 1:\n        raise ValueError('Invalid package. Multiple yaml files in the package.')\n        \n      with tar.extractfile(all_yaml_files[0]) as f:\n        return yaml.load(f)\n\n  def run_pipeline(self, experiment_id, job_name, pipeline_package_path, params={}):\n    \"\"\"Run a specified pipeline.\n\n    Args:\n      experiment_id: The string id of an experiment.\n      job_name: name of the job.\n      pipeline_package_path: local path of the pipeline package(tar.gz file).\n      params: a dictionary with key (string) as param name and value (string) as as param value.\n\n    Returns:\n      A run object. Most important field is id.\n    \"\"\"\n    import kfp_run\n\n    pipeline_obj = self._extract_pipeline_yaml(pipeline_package_path)\n    pipeline_json_string = json.dumps(pipeline_obj)\n    api_params = [kfp_run.ApiParameter(name=k, value=str(v)) for k,v in six.iteritems(params)]\n    key = kfp_run.models.ApiResourceKey(id=experiment_id,\n                                        type=kfp_run.models.ApiResourceType.EXPERIMENT)\n    reference = kfp_run.models.ApiResourceReference(key, kfp_run.models.ApiRelationship.OWNER)\n    spec = kfp_run.models.ApiPipelineSpec(\n        workflow_manifest=pipeline_json_string, parameters=api_params)\n    run_body = kfp_run.models.ApiRun(\n        pipeline_spec=spec, resource_references=[reference], name=job_name)\n\n    response = self._run_api.create_run(body=run_body)\n    \n    if self._is_ipython():\n      import IPython\n      html = ('Run link <a href=\"/pipeline/#/runs/details/%s\" target=\"_blank\" >here</a>'\n              % response.run.id)\n      IPython.display.display(IPython.display.HTML(html))\n    return response.run\n\n  def list_runs(self, page_token='', page_size=10, sort_by=''):\n    \"\"\"List runs.\n    Args:\n      page_token: token for starting of the page.\n      page_size: size of the page.\n      sort_by: one of 'field_name', 'field_name des'. For example, 'name des'.\n    Returns:\n      A response object including a list of experiments and next page token.\n    \"\"\"\n    response = self._run_api.list_runs(page_token=page_token, page_size=page_size, sort_by=sort_by)\n    return response\n\n  def get_run(self, run_id):\n    \"\"\"Get run details.\n    Args:\n      id of the run.\n    Returns:\n      A response object including details of a run.\n    Throws:\n      Exception if run is not found.\n    \"\"\"\n    return self._run_api.get_run(run_id=run_id)\n\n  def wait_for_run_completion(self, run_id, timeout):\n    \"\"\"Wait for a run to complete.\n    Args:\n      run_id: run id, returned from run_pipeline.\n      timeout: timeout in seconds.\n    Returns:\n      A run detail object: Most important fields are run and pipeline_runtime\n    \"\"\"\n    status = 'Running:'\n    start_time = datetime.now()\n    while status is None or status.lower() not in ['succeeded', 'failed', 'skipped', 'error']:\n      get_run_response = self._run_api.get_run(run_id=run_id)\n      status = get_run_response.run.status\n      elapsed_time = (datetime.now() - start_time).seconds\n      logging.info('Waiting for the job to complete...')\n      if elapsed_time > timeout:\n        raise TimeoutError('Run timeout')\n      time.sleep(5)\n    return get_run_response\n\n  def _get_workflow_json(self, run_id):\n    \"\"\"Get the workflow json.\n    Args:\n      run_id: run id, returned from run_pipeline.\n    Returns:\n      workflow: json workflow\n    \"\"\"\n    get_run_response = self._run_api.get_run(run_id=run_id)\n    workflow = get_run_response.pipeline_runtime.workflow_manifest\n    workflow_json = json.loads(workflow)\n    return workflow_json\n", "path": "sdk/python/kfp/_client.py"}]}