Separating Setup and Run
Learn about handling the agent setup and run in production.
Why separate setup and run invocation
In the Step 2 of the Quickstart example, the agent.setup()
and agent.run()
are written in the same script and executed in the same process. This method is good enough for a quick "Hello World".
However, in production, you might want to embed these invocations in separate flows.
The agent.setup()
method needs to be invoked only when there are updates to the instructions or tools.
For example, you might trigger agent.setup()
as part of your CI/CD pipeline, or every time your customer
updates an agent’s instructions or tools in cases where your platform allows customer-configured agents.
On the other hand, agent.run()
needs to run when you receive requests to be handled by the agent. For example, you might trigger the run as part of a web application or a Slack chatbot or other application request handling flows for the end users. Such flows are typically not your agent configuration flow.
Separate invocation while reuse code
With ADK, you can invoke agent.setup()
and agent.run()
separately in their appropriate context or flows,
while using the same agent definition. Example:
Python
agent_def.py
# Shared agent definition component using ADK
# To be imported and used by agent_setup.py and agent_run.py
@tool
def get_weather(location: str) -> Dict[str, str]:
"""Get the weather for a given location"""
return {"location": location, "temperature": 72, "unit": "F"}
client = AgentClient(
auth_type="api_key",
profile="DEFAULT",
region="us-chicago-1",
)
weather_agent = Agent(
client=client,
agent_endpoint_id="YOUR_AGENT_ENDPOINT_ID",
instructions="You perform weather queries using tools.",
tools=[get_weather]
)
agent_setup.py
# The setup code
# Invoke when agent definition changes
from agent_def import weather_agent
weather_agent.setup()
agent_run.py
# The run code
# Invoke when there's a request to handle
from agent_def import weather_agent
input = "Is it cold in Seattle?"
response = agent.run(input)
response.pretty_print()
Java
WeatherAgentSetup.java
package demos.weather;
import com.oracle.bmc.ConfigFileReader;
import com.oracle.bmc.adk.agent.Agent;
import com.oracle.bmc.adk.client.AgentClient;
import com.oracle.bmc.adk.tools.Param;
import com.oracle.bmc.adk.tools.Tool;
import com.oracle.bmc.adk.tools.Toolkit;
import com.oracle.bmc.auth.BasicAuthenticationDetailsProvider;
import com.oracle.bmc.auth.SessionTokenAuthenticationDetailsProvider;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Collections;
public class WeatherAgentSetup {
public static class WeatherToolkit extends Toolkit {
/**
* Get the weather for a given location.
*
* @param location The location to get the weather for.
* @return A map containing the weather information.
*/
@Tool(name = "getWeather", description = "Get weather of a given location")
public static Map<String, String> getWeather(
@Param(description = "The location") String location) {
Map<String, String> weather = new HashMap<>();
weather.put("location", location);
weather.put("temperature", "72");
weather.put("unit", "F");
return weather;
}
}
public static Agent setupWeatherAgent() {
// Initialize the AgentClient
final String configLocation = "~/.oci/config";
final String configProfile = "DEFAULT";
BasicAuthenticationDetailsProvider authProvider =
new SessionTokenAuthenticationDetailsProvider(
ConfigFileReader.parse(configLocation, configProfile));
AgentClient agentClient = AgentClient.builder()
.authProvider(authProvider)
.region("us-chicago-1")
.build();
Agent weatherAgent = Agent.builder()
.client(agentClient)
.agentEndpointId("YOUR_AGENT_ENDPOINT_ID")
.instructions("You perform weather queries using tools.")
.tools(Arrays.asList(new WeatherToolkit()))
.build();
return weatherAgent;
}
}
WeatherAgentSetupRunner.java
package demos.weather;
public class WeatherAgentSetupRunner {
public static void main(String[] args) {
try {
// Create and set up the weather agent
WeatherAgentSetup.setupWeatherAgent().setup();
System.out.println("Weather agent setup completed.");
} catch (Exception e) {
System.err.println("Failed to set up the weather agent: " + e.getMessage());
e.printStackTrace();
}
}
}
WeatherAgentRun.java
package demos.weather;
import com.oracle.bmc.adk.agent.Agent;
import com.oracle.bmc.adk.utils.RunResponse;
public class WeatherAgentRun {
public static void main(String[] args) {
try {
// Create the agent instance
Agent weatherAgent = WeatherAgentSetup.setupWeatherAgent().setup();
// Input prompt
String input = "Is it cold in Seattle?";
// Run the agent with the input
RunResponse response = weatherAgent.run(input);
// Print the result
response.prettyPrint();
} catch (Exception e) {
System.err.println("Failed to run the weather agent: " + e.getMessage());
e.printStackTrace();
}
}
}