Design framework-agnostic AI agents using Oracle's Open Agent Specification for portable, interoperable agentic systems with JSON/YAML definitions
Master Oracle's Open Agent Specification (Agent Spec) to design framework-agnostic, declarative AI agents that can be authored once and deployed across multiple frameworks and runtimes.
Framework-agnostic declarative language for defining agentic systems, building blocks for standalone agents and structured workflows, plus composition patterns for multi-agent systems.
Key Innovation: Decouple design from execution - write agents once, run anywhere.
Release: Technical report published October 2025 (arXiv:2510.04173)
The Problem: Fragmented agent development - each framework requires different implementation.
The Solution: Unified representation - Agent Spec defines structure and behavior in JSON/YAML that any compatible runtime can execute.
Benefit: Author agents once ā Deploy across frameworks ā Reduce redundant development.
Agent Spec defines conceptual building blocks (components) that make up agent-based systems.
Key Property: All components are trivially serializable to JSON/YAML.
Purpose: Text generation via LLM
Definition:
type: LLMNode
name: "text_generator"
model: "claude-sonnet-5"
system_prompt: "You are a helpful assistant"
temperature: 0.7
max_tokens: 2000
Purpose: External API calls
Definition:
type: APINode
name: "weather_api"
endpoint: "https://api.weather.com/v1/current"
method: "GET"
parameters:
location: "{input.location}"
headers:
Authorization: "Bearer {env.API_KEY}"
Purpose: Multi-round conversational agent
Definition:
type: AgentNode
name: "support_agent"
model: "gpt-4"
system_prompt: "You are a customer support specialist"
tools:
- type: function
name: "lookup_order"
- type: function
name: "process_refund"
Purpose: Orchestrate sequence of nodes
Definition:
type: WorkflowNode
name: "data_pipeline"
steps:
- node: extract_node
- node: transform_node
- node: load_node
error_handling: retry
{
"version": "1.0",
"agent": {
"name": "CustomerSupportAgent",
"description": "Handles customer inquiries and support requests",
"components": {
"classifier": {
"type": "LLMNode",
"model": "claude-haiku-4-5",
"system_prompt": "Classify customer inquiry type",
"output": "inquiry_type"
},
"technical_support": {
"type": "AgentNode",
"model": "claude-sonnet-5",
"tools": ["diagnose_issue", "escalate_ticket"]
},
"billing_support": {
"type": "AgentNode",
"model": "gpt-4",
"tools": ["lookup_invoice", "process_refund"]
},
"router": {
"type": "ConditionalNode",
"conditions": [
{
"if": "inquiry_type == 'technical'",
"then": "technical_support"
},
{
"if": "inquiry_type == 'billing'",
"then": "billing_support"
}
]
}
},
"entry_point": "classifier"
}
}
version: "1.0"
system:
name: "ResearchSystem"
description: "Multi-agent research and analysis system"
agents:
researcher:
type: AgentNode
model: claude-sonnet-5
tools:
- web_search
- fetch_document
system_prompt: "Research topics thoroughly"
analyzer:
type: AgentNode
model: gpt-4o
tools:
- analyze_data
- generate_insights
system_prompt: "Analyze research findings"
synthesizer:
type: AgentNode
model: claude-sonnet-5
system_prompt: "Synthesize findings into coherent report"
workflow:
- step: researcher
output: research_data
- step: analyzer
input: research_data
output: analysis
- step: synthesizer
input: [research_data, analysis]
output: final_report
output: final_report
SequentialNode:
type: SequentialNode
nodes:
- step1_node
- step2_node
- step3_node
ParallelNode:
type: ParallelNode
nodes:
- agent_a
- agent_b
- agent_c
aggregator: synthesis_node
ConditionalNode:
type: ConditionalNode
condition: "{output.confidence} > 0.8"
if_true: high_confidence_path
if_false: manual_review_path
LoopNode:
type: LoopNode
condition: "{not output.success}"
max_iterations: 3
body: retry_agent
MCPNode:
type: MCPNode
server: "github-server"
resource: "issues"
operation: "list"
filters:
assignee: "me"
DatabaseNode:
type: DatabaseNode
connection: "postgresql://..."
query: "SELECT * FROM customers WHERE id = {input.customer_id}"
name: TriageSystem
components:
classifier:
type: LLMNode
model: claude-haiku-4-5
prompt: "Classify: {input}"
router:
type: ConditionalNode
conditions:
- if: "category == 'urgent'"
then: urgent_agent
- if: "category == 'standard'"
then: standard_agent
- default: fallback_agent
name: ResearchPipeline
workflow:
- name: gather
type: AgentNode
tools: [web_search, fetch_docs]
- name: analyze
type: LLMNode
prompt: "Analyze: {gather.output}"
- name: report
type: LLMNode
prompt: "Generate report from: {analyze.output}"
name: MultiPerspective
components:
parallel_agents:
type: ParallelNode
nodes:
- technical_expert
- business_expert
- user_perspective
synthesizer:
type: AgentNode
system_prompt: "Synthesize perspectives into unified recommendation"
input: "{parallel_agents.outputs}"
Agent Spec can be executed by any compatible runtime:
agent_spec package# Load Agent Spec definition
from agent_spec import load_spec
spec = load_spec("my_agent.yaml")
# Compile to target framework
langgraph_agent = spec.compile(target="langgraph")
autogen_agent = spec.compile(target="autogen")
oracle_adk_agent = spec.compile(target="oracle_adk")
# All three agents have identical behavior
ā Use descriptive names for all components ā Document purpose in description fields ā Define explicit input/output schemas ā Specify error handling strategies ā Version your agent specifications ā Test across multiple runtimes for true portability
ā Embed runtime-specific logic in specs ā Hardcode credentials or secrets ā Use framework-specific syntax ā Skip input validation definitions ā Ignore version compatibility
Relationship: MCP standardizes tool/resource provisioning; Agent Spec standardizes agent configuration.
Together:
agent:
name: DataAgent
tools:
- type: MCPTool
server: "postgres-mcp"
resource: "customers"
- type: MCPTool
server: "github-mcp"
resource: "issues"
Relationship: A2A standardizes inter-agent communication; Agent Spec defines agent structure.
Together:
multi_agent_system:
agents:
- name: agent1
a2a_endpoint: "https://agent1.example.com"
- name: agent2
a2a_endpoint: "https://agent2.example.com"
communication: a2a_protocol
pip install pyagentspec
from pyagentspec import AgentSpec, LLMNode, AgentNode
spec = AgentSpec(
name="MyAgent",
components=[
LLMNode(name="classifier", model="claude-haiku-4-5"),
AgentNode(name="executor", model="gpt-4")
]
)
spec.save("my_agent.yaml")
spec.compile(target="oracle_adk")
from pyagentspec import validate_spec
is_valid, errors = validate_spec("agent.yaml")
if not is_valid:
print(f"Validation errors: {errors}")
Use Agent Spec when:
Combine with:
Official:
Citation:
Oracle Corporation. (2025). Open Agent Specification (Agent Spec) Technical Report.
This skill enables you to design portable, reusable AI agents using Oracle's open specification standard for 2025 and beyond.