<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="ml_v1.html">Google Cloud Machine Learning Engine</a> . <a href="ml_v1.projects.html">projects</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="ml_v1.projects.jobs.html">jobs()</a></code>
</p>
<p class="firstline">Returns the jobs Resource.</p>

<p class="toc_element">
  <code><a href="ml_v1.projects.models.html">models()</a></code>
</p>
<p class="firstline">Returns the models Resource.</p>

<p class="toc_element">
  <code><a href="ml_v1.projects.operations.html">operations()</a></code>
</p>
<p class="firstline">Returns the operations Resource.</p>

<p class="toc_element">
  <code><a href="#getConfig">getConfig(name, x__xgafv=None)</a></code></p>
<p class="firstline">Get the service account information associated with your project. You need</p>
<p class="toc_element">
  <code><a href="#predict">predict(name, body, x__xgafv=None)</a></code></p>
<p class="firstline">Performs prediction on the data in the request.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="getConfig">getConfig(name, x__xgafv=None)</code>
  <pre>Get the service account information associated with your project. You need
this information in order to grant the service account persmissions for
the Google Cloud Storage location where you put your model training code
for training the model with Google Cloud Machine Learning.

Args:
  name: string, Required. The project name.

Authorization: requires `Viewer` role on the specified project. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Returns service account information associated with a project.
    "serviceAccountProject": "A String", # The project number for `service_account`.
    "serviceAccount": "A String", # The service account Cloud ML uses to access resources in the project.
  }</pre>
</div>

<div class="method">
    <code class="details" id="predict">predict(name, body, x__xgafv=None)</code>
  <pre>Performs prediction on the data in the request.

**** REMOVE FROM GENERATED DOCUMENTATION

Args:
  name: string, Required. The resource name of a model or a version.

Authorization: requires `Viewer` role on the parent project. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Request for predictions to be issued against a trained model.
      # 
      # The body of the request is a single JSON object with a single top-level
      # field:
      # 
      # <dl>
      #   <dt>instances</dt>
      #   <dd>A JSON array containing values representing the instances to use for
      #       prediction.</dd>
      # </dl>
      # 
      # The structure of each element of the instances list is determined by your
      # model's input definition. Instances can include named inputs or can contain
      # only unlabeled values.
      # 
      # Not all data includes named inputs. Some instances will be simple
      # JSON values (boolean, number, or string). However, instances are often lists
      # of simple values, or complex nested lists. Here are some examples of request
      # bodies:
      # 
      # CSV data with each row encoded as a string value:
      # <pre>
      # {"instances": ["1.0,true,\\"x\\"", "-2.0,false,\\"y\\""]}
      # </pre>
      # Plain text:
      # <pre>
      # {"instances": ["the quick brown fox", "la bruja le dio"]}
      # </pre>
      # Sentences encoded as lists of words (vectors of strings):
      # <pre>
      # {
      #   "instances": [
      #     ["the","quick","brown"],
      #     ["la","bruja","le"],
      #     ...
      #   ]
      # }
      # </pre>
      # Floating point scalar values:
      # <pre>
      # {"instances": [0.0, 1.1, 2.2]}
      # </pre>
      # Vectors of integers:
      # <pre>
      # {
      #   "instances": [
      #     [0, 1, 2],
      #     [3, 4, 5],
      #     ...
      #   ]
      # }
      # </pre>
      # Tensors (in this case, two-dimensional tensors):
      # <pre>
      # {
      #   "instances": [
      #     [
      #       [0, 1, 2],
      #       [3, 4, 5]
      #     ],
      #     ...
      #   ]
      # }
      # </pre>
      # Images can be represented different ways. In this encoding scheme the first
      # two dimensions represent the rows and columns of the image, and the third
      # contains lists (vectors) of the R, G, and B values for each pixel.
      # <pre>
      # {
      #   "instances": [
      #     [
      #       [
      #         [138, 30, 66],
      #         [130, 20, 56],
      #         ...
      #       ],
      #       [
      #         [126, 38, 61],
      #         [122, 24, 57],
      #         ...
      #       ],
      #       ...
      #     ],
      #     ...
      #   ]
      # }
      # </pre>
      # JSON strings must be encoded as UTF-8. To send binary data, you must
      # base64-encode the data and mark it as binary. To mark a JSON string
      # as binary, replace it with a JSON object with a single attribute named `b64`:
      # <pre>{"b64": "..."} </pre>
      # For example:
      # 
      # Two Serialized tf.Examples (fake data, for illustrative purposes only):
      # <pre>
      # {"instances": [{"b64": "X5ad6u"}, {"b64": "IA9j4nx"}]}
      # </pre>
      # Two JPEG image byte strings (fake data, for illustrative purposes only):
      # <pre>
      # {"instances": [{"b64": "ASa8asdf"}, {"b64": "JLK7ljk3"}]}
      # </pre>
      # If your data includes named references, format each instance as a JSON object
      # with the named references as the keys:
      # 
      # JSON input data to be preprocessed:
      # <pre>
      # {
      #   "instances": [
      #     {
      #       "a": 1.0,
      #       "b": true,
      #       "c": "x"
      #     },
      #     {
      #       "a": -2.0,
      #       "b": false,
      #       "c": "y"
      #     }
      #   ]
      # }
      # </pre>
      # Some models have an underlying TensorFlow graph that accepts multiple input
      # tensors. In this case, you should use the names of JSON name/value pairs to
      # identify the input tensors, as shown in the following exmaples:
      # 
      # For a graph with input tensor aliases "tag" (string) and "image"
      # (base64-encoded string):
      # <pre>
      # {
      #   "instances": [
      #     {
      #       "tag": "beach",
      #       "image": {"b64": "ASa8asdf"}
      #     },
      #     {
      #       "tag": "car",
      #       "image": {"b64": "JLK7ljk3"}
      #     }
      #   ]
      # }
      # </pre>
      # For a graph with input tensor aliases "tag" (string) and "image"
      # (3-dimensional array of 8-bit ints):
      # <pre>
      # {
      #   "instances": [
      #     {
      #       "tag": "beach",
      #       "image": [
      #         [
      #           [138, 30, 66],
      #           [130, 20, 56],
      #           ...
      #         ],
      #         [
      #           [126, 38, 61],
      #           [122, 24, 57],
      #           ...
      #         ],
      #         ...
      #       ]
      #     },
      #     {
      #       "tag": "car",
      #       "image": [
      #         [
      #           [255, 0, 102],
      #           [255, 0, 97],
      #           ...
      #         ],
      #         [
      #           [254, 1, 101],
      #           [254, 2, 93],
      #           ...
      #         ],
      #         ...
      #       ]
      #     },
      #     ...
      #   ]
      # }
      # </pre>
      # If the call is successful, the response body will contain one prediction
      # entry per instance in the request body. If prediction fails for any
      # instance, the response body will contain no predictions and will contian
      # a single error entry instead.
    "httpBody": { # Message that represents an arbitrary HTTP body. It should only be used for # 
        # Required. The prediction request body.
        # payload formats that can't be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      "contentType": "A String", # The HTTP Content-Type string representing the content type of the body.
      "data": "A String", # HTTP body binary data.
      "extensions": [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
      # payload formats that can't be represented as JSON, such as raw binary or
      # an HTML page.
      #
      #
      # This message can be used both in streaming and non-streaming API methods in
      # the request as well as the response.
      #
      # It can be used as a top-level request field, which is convenient if one
      # wants to extract parameters from either the URL or HTTP template into the
      # request fields and also want access to the raw HTTP body.
      #
      # Example:
      #
      #     message GetResourceRequest {
      #       // A unique request id.
      #       string request_id = 1;
      #
      #       // The raw HTTP body is bound to this field.
      #       google.api.HttpBody http_body = 2;
      #     }
      #
      #     service ResourceService {
      #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
      #       rpc UpdateResource(google.api.HttpBody) returns (google.protobuf.Empty);
      #     }
      #
      # Example with streaming methods:
      #
      #     service CaldavService {
      #       rpc GetCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #       rpc UpdateCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #     }
      #
      # Use of this type only changes how the request and response bodies are
      # handled, all other features will continue to work unchanged.
    "contentType": "A String", # The HTTP Content-Type string representing the content type of the body.
    "data": "A String", # HTTP body binary data.
    "extensions": [ # Application specific response metadata. Must be set in the first response
        # for streaming APIs.
      {
        "a_key": "", # Properties of the object. Contains field @type with type URL.
      },
    ],
  }</pre>
</div>

</body></html>