<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="dialogflow_v2beta1.html">Dialogflow API</a> . <a href="dialogflow_v2beta1.projects.html">projects</a> . <a href="dialogflow_v2beta1.projects.agent.html">agent</a> . <a href="dialogflow_v2beta1.projects.agent.sessions.html">sessions</a> . <a href="dialogflow_v2beta1.projects.agent.sessions.contexts.html">contexts</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a context.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes the specified context.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Retrieves the specified context.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns the list of all contexts in the specified session.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates the specified context.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>Creates a context.

If the specified context already exists, overrides the context.

Args:
  parent: string, Required. The session to create a context for.
Format: `projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;` or
`projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
ID&gt;/sessions/&lt;Session ID&gt;`. If `Environment ID` is not specified, we assume
default &#x27;draft&#x27; environment. If `User ID` is not specified, we assume
default &#x27;-&#x27; user. (required)
  body: object, The request body.
    The object takes the form of:

{ # Represents a context.
  &quot;lifespanCount&quot;: 42, # Optional. The number of conversational query requests after which the
      # context expires. The default is `0`. If set to `0`, the context expires
      # immediately. Contexts expire automatically after 20 minutes if there
      # are no matching queries.
  &quot;name&quot;: &quot;A String&quot;, # Required. The unique identifier of the context. Format:
      # `projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`,
      # or `projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
      # ID&gt;/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`.
      # 
      # The `Context ID` is always converted to lowercase, may only contain
      # characters in a-zA-Z0-9_-% and may be at most 250 bytes long.
      # 
      # If `Environment ID` is not specified, we assume default &#x27;draft&#x27;
      # environment. If `User ID` is not specified, we assume default &#x27;-&#x27; user.
      # 
      # The following context names are reserved for internal use by Dialogflow.
      # You should not use these contexts or create contexts with these names:
      # 
      # * `__system_counters__`
      # * `*_id_dialog_context`
      # * `*_dialog_params_size`
  &quot;parameters&quot;: { # Optional. The collection of parameters associated with this context.
      # 
      # Depending on your protocol or client library language, this is a
      # map, associative array, symbol table, dictionary, or JSON object
      # composed of a collection of (MapKey, MapValue) pairs:
      # 
      # -   MapKey type: string
      # -   MapKey value: parameter name
      # -   MapValue type:
      #     -   If parameter&#x27;s entity type is a composite entity: map
      #     -   Else: string or number, depending on parameter value type
      # -   MapValue value:
      #     -   If parameter&#x27;s entity type is a composite entity:
      #         map from composite entity property names to property values
      #     -   Else: parameter value
    &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
  },
}

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

Returns:
  An object of the form:

    { # Represents a context.
    &quot;lifespanCount&quot;: 42, # Optional. The number of conversational query requests after which the
        # context expires. The default is `0`. If set to `0`, the context expires
        # immediately. Contexts expire automatically after 20 minutes if there
        # are no matching queries.
    &quot;name&quot;: &quot;A String&quot;, # Required. The unique identifier of the context. Format:
        # `projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`,
        # or `projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
        # ID&gt;/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`.
        #
        # The `Context ID` is always converted to lowercase, may only contain
        # characters in a-zA-Z0-9_-% and may be at most 250 bytes long.
        #
        # If `Environment ID` is not specified, we assume default &#x27;draft&#x27;
        # environment. If `User ID` is not specified, we assume default &#x27;-&#x27; user.
        #
        # The following context names are reserved for internal use by Dialogflow.
        # You should not use these contexts or create contexts with these names:
        #
        # * `__system_counters__`
        # * `*_id_dialog_context`
        # * `*_dialog_params_size`
    &quot;parameters&quot;: { # Optional. The collection of parameters associated with this context.
        #
        # Depending on your protocol or client library language, this is a
        # map, associative array, symbol table, dictionary, or JSON object
        # composed of a collection of (MapKey, MapValue) pairs:
        #
        # -   MapKey type: string
        # -   MapKey value: parameter name
        # -   MapValue type:
        #     -   If parameter&#x27;s entity type is a composite entity: map
        #     -   Else: string or number, depending on parameter value type
        # -   MapValue value:
        #     -   If parameter&#x27;s entity type is a composite entity:
        #         map from composite entity property names to property values
        #     -   Else: parameter value
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Deletes the specified context.

Args:
  name: string, Required. The name of the context to delete. Format:
`projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`
or `projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
ID&gt;/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`. If `Environment ID` is
not specified, we assume default &#x27;draft&#x27; environment. If `User ID` is not
specified, we assume default &#x27;-&#x27; user. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Retrieves the specified context.

Args:
  name: string, Required. The name of the context. Format:
`projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`
or `projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
ID&gt;/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`. If `Environment ID` is
not specified, we assume default &#x27;draft&#x27; environment. If `User ID` is not
specified, we assume default &#x27;-&#x27; user. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Represents a context.
    &quot;lifespanCount&quot;: 42, # Optional. The number of conversational query requests after which the
        # context expires. The default is `0`. If set to `0`, the context expires
        # immediately. Contexts expire automatically after 20 minutes if there
        # are no matching queries.
    &quot;name&quot;: &quot;A String&quot;, # Required. The unique identifier of the context. Format:
        # `projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`,
        # or `projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
        # ID&gt;/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`.
        #
        # The `Context ID` is always converted to lowercase, may only contain
        # characters in a-zA-Z0-9_-% and may be at most 250 bytes long.
        #
        # If `Environment ID` is not specified, we assume default &#x27;draft&#x27;
        # environment. If `User ID` is not specified, we assume default &#x27;-&#x27; user.
        #
        # The following context names are reserved for internal use by Dialogflow.
        # You should not use these contexts or create contexts with these names:
        #
        # * `__system_counters__`
        # * `*_id_dialog_context`
        # * `*_dialog_params_size`
    &quot;parameters&quot;: { # Optional. The collection of parameters associated with this context.
        #
        # Depending on your protocol or client library language, this is a
        # map, associative array, symbol table, dictionary, or JSON object
        # composed of a collection of (MapKey, MapValue) pairs:
        #
        # -   MapKey type: string
        # -   MapKey value: parameter name
        # -   MapValue type:
        #     -   If parameter&#x27;s entity type is a composite entity: map
        #     -   Else: string or number, depending on parameter value type
        # -   MapValue value:
        #     -   If parameter&#x27;s entity type is a composite entity:
        #         map from composite entity property names to property values
        #     -   Else: parameter value
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, pageToken=None, pageSize=None, x__xgafv=None)</code>
  <pre>Returns the list of all contexts in the specified session.

Args:
  parent: string, Required. The session to list all contexts from.
Format: `projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;` or
`projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
ID&gt;/sessions/&lt;Session ID&gt;`. If `Environment ID` is not specified, we assume
default &#x27;draft&#x27; environment. If `User ID` is not specified, we assume
default &#x27;-&#x27; user. (required)
  pageToken: string, Optional. The next_page_token value returned from a previous list request.
  pageSize: integer, Optional. The maximum number of items to return in a single page. By
default 100 and at most 1000.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response message for Contexts.ListContexts.
    &quot;nextPageToken&quot;: &quot;A String&quot;, # Token to retrieve the next page of results, or empty if there are no
        # more results in the list.
    &quot;contexts&quot;: [ # The list of contexts. There will be a maximum number of items
        # returned based on the page_size field in the request.
      { # Represents a context.
        &quot;lifespanCount&quot;: 42, # Optional. The number of conversational query requests after which the
            # context expires. The default is `0`. If set to `0`, the context expires
            # immediately. Contexts expire automatically after 20 minutes if there
            # are no matching queries.
        &quot;name&quot;: &quot;A String&quot;, # Required. The unique identifier of the context. Format:
            # `projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`,
            # or `projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
            # ID&gt;/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`.
            #
            # The `Context ID` is always converted to lowercase, may only contain
            # characters in a-zA-Z0-9_-% and may be at most 250 bytes long.
            #
            # If `Environment ID` is not specified, we assume default &#x27;draft&#x27;
            # environment. If `User ID` is not specified, we assume default &#x27;-&#x27; user.
            #
            # The following context names are reserved for internal use by Dialogflow.
            # You should not use these contexts or create contexts with these names:
            #
            # * `__system_counters__`
            # * `*_id_dialog_context`
            # * `*_dialog_params_size`
        &quot;parameters&quot;: { # Optional. The collection of parameters associated with this context.
            #
            # Depending on your protocol or client library language, this is a
            # map, associative array, symbol table, dictionary, or JSON object
            # composed of a collection of (MapKey, MapValue) pairs:
            #
            # -   MapKey type: string
            # -   MapKey value: parameter name
            # -   MapValue type:
            #     -   If parameter&#x27;s entity type is a composite entity: map
            #     -   Else: string or number, depending on parameter value type
            # -   MapValue value:
            #     -   If parameter&#x27;s entity type is a composite entity:
            #         map from composite entity property names to property values
            #     -   Else: parameter value
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call &#x27;execute()&#x27; on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates the specified context.

Args:
  name: string, Required. The unique identifier of the context. Format:
`projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`,
or `projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
ID&gt;/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`.

The `Context ID` is always converted to lowercase, may only contain
characters in a-zA-Z0-9_-% and may be at most 250 bytes long.

If `Environment ID` is not specified, we assume default &#x27;draft&#x27;
environment. If `User ID` is not specified, we assume default &#x27;-&#x27; user.

The following context names are reserved for internal use by Dialogflow.
You should not use these contexts or create contexts with these names:

* `__system_counters__`
* `*_id_dialog_context`
* `*_dialog_params_size` (required)
  body: object, The request body.
    The object takes the form of:

{ # Represents a context.
  &quot;lifespanCount&quot;: 42, # Optional. The number of conversational query requests after which the
      # context expires. The default is `0`. If set to `0`, the context expires
      # immediately. Contexts expire automatically after 20 minutes if there
      # are no matching queries.
  &quot;name&quot;: &quot;A String&quot;, # Required. The unique identifier of the context. Format:
      # `projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`,
      # or `projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
      # ID&gt;/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`.
      # 
      # The `Context ID` is always converted to lowercase, may only contain
      # characters in a-zA-Z0-9_-% and may be at most 250 bytes long.
      # 
      # If `Environment ID` is not specified, we assume default &#x27;draft&#x27;
      # environment. If `User ID` is not specified, we assume default &#x27;-&#x27; user.
      # 
      # The following context names are reserved for internal use by Dialogflow.
      # You should not use these contexts or create contexts with these names:
      # 
      # * `__system_counters__`
      # * `*_id_dialog_context`
      # * `*_dialog_params_size`
  &quot;parameters&quot;: { # Optional. The collection of parameters associated with this context.
      # 
      # Depending on your protocol or client library language, this is a
      # map, associative array, symbol table, dictionary, or JSON object
      # composed of a collection of (MapKey, MapValue) pairs:
      # 
      # -   MapKey type: string
      # -   MapKey value: parameter name
      # -   MapValue type:
      #     -   If parameter&#x27;s entity type is a composite entity: map
      #     -   Else: string or number, depending on parameter value type
      # -   MapValue value:
      #     -   If parameter&#x27;s entity type is a composite entity:
      #         map from composite entity property names to property values
      #     -   Else: parameter value
    &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
  },
}

  updateMask: string, Optional. The mask to control which fields get updated.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Represents a context.
    &quot;lifespanCount&quot;: 42, # Optional. The number of conversational query requests after which the
        # context expires. The default is `0`. If set to `0`, the context expires
        # immediately. Contexts expire automatically after 20 minutes if there
        # are no matching queries.
    &quot;name&quot;: &quot;A String&quot;, # Required. The unique identifier of the context. Format:
        # `projects/&lt;Project ID&gt;/agent/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`,
        # or `projects/&lt;Project ID&gt;/agent/environments/&lt;Environment ID&gt;/users/&lt;User
        # ID&gt;/sessions/&lt;Session ID&gt;/contexts/&lt;Context ID&gt;`.
        #
        # The `Context ID` is always converted to lowercase, may only contain
        # characters in a-zA-Z0-9_-% and may be at most 250 bytes long.
        #
        # If `Environment ID` is not specified, we assume default &#x27;draft&#x27;
        # environment. If `User ID` is not specified, we assume default &#x27;-&#x27; user.
        #
        # The following context names are reserved for internal use by Dialogflow.
        # You should not use these contexts or create contexts with these names:
        #
        # * `__system_counters__`
        # * `*_id_dialog_context`
        # * `*_dialog_params_size`
    &quot;parameters&quot;: { # Optional. The collection of parameters associated with this context.
        #
        # Depending on your protocol or client library language, this is a
        # map, associative array, symbol table, dictionary, or JSON object
        # composed of a collection of (MapKey, MapValue) pairs:
        #
        # -   MapKey type: string
        # -   MapKey value: parameter name
        # -   MapValue type:
        #     -   If parameter&#x27;s entity type is a composite entity: map
        #     -   Else: string or number, depending on parameter value type
        # -   MapValue value:
        #     -   If parameter&#x27;s entity type is a composite entity:
        #         map from composite entity property names to property values
        #     -   Else: parameter value
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
    },
  }</pre>
</div>

</body></html>