<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_v1beta1.html">Google Cloud Machine Learning Engine</a> . <a href="ml_v1beta1.projects.html">projects</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="ml_v1beta1.projects.jobs.html">jobs()</a></code>
</p>
<p class="firstline">Returns the jobs Resource.</p>

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

<p class="toc_element">
  <code><a href="ml_v1beta1.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>