Integration guide
AgentGen + OpenAI Function Calling
OpenAI's function calling (tool calling) lets GPT-4o decide when to invoke external APIs. Define AgentGen's PDF and image endpoints as tools, and your GPT-4o agent will produce downloadable documents as a natural part of any conversation.
Install
pip install openai requests python-dotenv
Step 1 — Define the tool schemas
tools = [
{
"type": "function",
"function": {
"name": "generate_pdf",
"description": (
"Render an HTML document to a PDF and return a CDN download URL. "
"Cost: 2 tokens per page. Use for invoices, reports, certificates."
),
"parameters": {
"type": "object",
"properties": {
"html": {
"type": "string",
"description": "Complete HTML document to render as PDF",
},
"page_size": {
"type": "string",
"enum": ["A4", "Letter", "A3", "Legal"],
"default": "A4",
},
},
"required": ["html"],
},
},
},
{
"type": "function",
"function": {
"name": "generate_image",
"description": (
"Render HTML to a PNG, JPEG, or WebP image and return a CDN URL. "
"Cost: 1 token. Use for OG images, thumbnails, screenshots."
),
"parameters": {
"type": "object",
"properties": {
"html": {"type": "string", "description": "HTML to render as image"},
"width": {"type": "integer", "default": 1200},
"height": {"type": "integer", "default": 630},
"format": {"type": "string", "enum": ["png", "jpeg", "webp"], "default": "png"},
},
"required": ["html"],
},
},
},
]Step 2 — Implement the tool handlers
import os, json, requests
AGENTGEN_KEY = os.environ["AGENTGEN_API_KEY"]
def handle_tool_call(name: str, arguments: str) -> str:
args = json.loads(arguments)
if name == "generate_pdf":
r = requests.post(
"https://www.agent-gen.com/api/v1/generate/pdf",
headers={"X-API-Key": AGENTGEN_KEY, "Content-Type": "application/json"},
json={"html": args["html"], "format": args.get("format", "A4")},
timeout=30,
)
elif name == "generate_image":
r = requests.post(
"https://www.agent-gen.com/api/v1/generate/image",
headers={"X-API-Key": AGENTGEN_KEY, "Content-Type": "application/json"},
json={
"html": args["html"],
"width": args.get("width", 1200),
"height": args.get("height", 630),
"format": args.get("format", "png"),
},
timeout=30,
)
else:
return json.dumps({"error": f"Unknown tool: {name}"})
if r.status_code == 402:
return json.dumps({"error": "Insufficient tokens. Visit agent-gen.com/pricing."})
r.raise_for_status()
return json.dumps(r.json())Step 3 — The agent loop
from openai import OpenAI
client = OpenAI()
def run_agent(user_message: str) -> str:
messages = [
{
"role": "system",
"content": (
"You are a helpful assistant that can generate PDFs and images. "
"When a user asks for a document or image, write clean HTML with "
"inline styles and call the appropriate tool."
),
},
{"role": "user", "content": user_message},
]
while True:
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto",
)
msg = response.choices[0].message
if msg.tool_calls:
messages.append(msg)
for call in msg.tool_calls:
result = handle_tool_call(call.function.name, call.function.arguments)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result,
})
else:
return msg.content
# Run it
print(run_agent("Create a PDF invoice for Acme Corp, $3,500 for API development, due April 1"))
# → "Here's your invoice: https://cdn.agent-gen.com/output/abc123.pdf"Using with the Assistants API
The same tool definitions work with the OpenAI Assistants API. Create an Assistant with the tools array above, then handle requires_action run statuses the same way:
assistant = client.beta.assistants.create(
name="Document Generator",
instructions="Generate professional PDFs and images using the provided tools.",
model="gpt-4o",
tools=tools,
)
thread = client.beta.threads.create()
client.beta.threads.messages.create(thread.id, role="user",
content="Generate a certificate PDF for Alice Smith, Python course, March 2026")
run = client.beta.threads.runs.create_and_poll(
thread_id=thread.id,
assistant_id=assistant.id,
)
if run.status == "requires_action":
tool_outputs = []
for call in run.required_action.submit_tool_outputs.tool_calls:
output = handle_tool_call(call.function.name, call.function.arguments)
tool_outputs.append({"tool_call_id": call.id, "output": output})
run = client.beta.threads.runs.submit_tool_outputs_and_poll(
thread_id=thread.id, run_id=run.id, tool_outputs=tool_outputs,
)Give your GPT-4o agent document generation
50 free tokens on signup. No credit card required.