@@ -1964,6 +1964,74 @@ def _run_agent(
19641964 os .environ ["GOOGLE_CLOUD_LOCATION" ] = original_location
19651965
19661966
1967+ def _create_agent_engine_session (
1968+ * ,
1969+ agent_engine : types .AgentEngine ,
1970+ user_id : str ,
1971+ session_state : Optional [dict [str , Any ]] = None ,
1972+ ) -> Any :
1973+ """Creates a session for an agent engine and returns the session ID.
1974+
1975+ First attempts to use the agent engine's own `create_session` operation
1976+ (available for agents deployed via AdkApp). If the agent engine does not
1977+ have `create_session` registered, falls back to the managed Vertex AI
1978+ Sessions API.
1979+
1980+ Args:
1981+ agent_engine: The AgentEngine instance.
1982+ user_id: The user ID for the session.
1983+ session_state: Optional initial state for the session.
1984+
1985+ Returns:
1986+ The session ID string.
1987+
1988+ Raises:
1989+ RuntimeError: If the session could not be created via either path.
1990+ """
1991+ try :
1992+ session = agent_engine .create_session ( # type: ignore[attr-defined]
1993+ user_id = user_id ,
1994+ state = session_state ,
1995+ )
1996+ return session ["id" ]
1997+ except AttributeError as exc :
1998+ # Agent engine does not have create_session registered (e.g. deployed
1999+ # via Console, gcloud, or source code deployment without AdkApp).
2000+ # Fall back to the managed Vertex AI Sessions API.
2001+ logger .info (
2002+ "Agent engine does not have 'create_session' operation registered."
2003+ " Falling back to managed Sessions API."
2004+ )
2005+ if agent_engine .api_resource is None :
2006+ raise RuntimeError (
2007+ "Failed to create session: agent_engine.api_resource is None."
2008+ ) from exc
2009+ if agent_engine .api_client is None :
2010+ raise RuntimeError (
2011+ "Failed to create session: agent_engine.api_client is None."
2012+ ) from exc
2013+ operation = agent_engine .api_client .sessions .create (
2014+ name = agent_engine .api_resource .name ,
2015+ user_id = user_id ,
2016+ config = types .CreateAgentEngineSessionConfig (
2017+ session_state = session_state ,
2018+ ),
2019+ )
2020+ if operation .response and operation .response .name :
2021+ # Session name format:
2022+ # projects/{p}/locations/{l}/reasoningEngines/{re}/sessions/{id}
2023+ return operation .response .name .split ("/" )[- 1 ]
2024+ elif operation .error :
2025+ raise RuntimeError (
2026+ f"Failed to create session via managed API: { operation .error } "
2027+ ) from exc
2028+ else :
2029+ raise RuntimeError (
2030+ "Failed to create session via managed API: "
2031+ "operation returned no response."
2032+ ) from exc
2033+
2034+
19672035def _execute_agent_run_with_retry (
19682036 row : pd .Series ,
19692037 contents : Union [genai_types .ContentListUnion , genai_types .ContentListUnionDict ],
@@ -1975,9 +2043,10 @@ def _execute_agent_run_with_retry(
19752043 session_inputs = _get_session_inputs (row )
19762044 user_id = session_inputs .user_id
19772045 session_state = session_inputs .state
1978- session = agent_engine .create_session ( # type: ignore[attr-defined]
2046+ session_id = _create_agent_engine_session (
2047+ agent_engine = agent_engine ,
19792048 user_id = user_id ,
1980- state = session_state ,
2049+ session_state = session_state ,
19812050 )
19822051 except KeyError as e :
19832052 return {"error" : f"Failed to get all required agent engine inputs: { e } " }
@@ -1988,7 +2057,7 @@ def _execute_agent_run_with_retry(
19882057 responses = []
19892058 for event in agent_engine .stream_query ( # type: ignore[attr-defined]
19902059 user_id = user_id ,
1991- session_id = session [ "id" ] ,
2060+ session_id = session_id ,
19922061 message = contents ,
19932062 ):
19942063 if event and CONTENT in event and PARTS in event [CONTENT ]:
0 commit comments