From 2b02961887bc840d5b30bb77a761af5690cda1a6 Mon Sep 17 00:00:00 2001 From: NoamBenS Date: Wed, 27 May 2026 17:29:50 -0400 Subject: [PATCH] includes example for openai js sdk --- .../.env.example | 8 ++ .../openai-agent-sdk-js-telemetry/.gitignore | 26 +++++++ .../openai-agent-sdk-js-telemetry/README.md | 57 +++++++++++++++ .../openai-agent-sdk-js-telemetry/main.ts | 73 +++++++++++++++++++ .../package.json | 25 +++++++ .../tsconfig.json | 13 ++++ 6 files changed, 202 insertions(+) create mode 100644 examples/openai-agent-sdk-js-telemetry/.env.example create mode 100644 examples/openai-agent-sdk-js-telemetry/.gitignore create mode 100644 examples/openai-agent-sdk-js-telemetry/README.md create mode 100644 examples/openai-agent-sdk-js-telemetry/main.ts create mode 100644 examples/openai-agent-sdk-js-telemetry/package.json create mode 100644 examples/openai-agent-sdk-js-telemetry/tsconfig.json diff --git a/examples/openai-agent-sdk-js-telemetry/.env.example b/examples/openai-agent-sdk-js-telemetry/.env.example new file mode 100644 index 0000000..0fbfd7f --- /dev/null +++ b/examples/openai-agent-sdk-js-telemetry/.env.example @@ -0,0 +1,8 @@ +# Required for OpenAI API calls. +OPENAI_API_KEY= + +# Required for PromptLayer tracing. +PROMPTLAYER_API_KEY= + +# Optional. Defaults to gpt-5. +OPENAI_MODEL=gpt-5 diff --git a/examples/openai-agent-sdk-js-telemetry/.gitignore b/examples/openai-agent-sdk-js-telemetry/.gitignore new file mode 100644 index 0000000..c0360c4 --- /dev/null +++ b/examples/openai-agent-sdk-js-telemetry/.gitignore @@ -0,0 +1,26 @@ +# Dependencies +node_modules/ + +# Environment +.env +.env.* +!.env.example + +# Build output +dist/ +build/ + +# TypeScript +*.tsbuildinfo + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# OS/editor +.DS_Store +.vscode/ +.idea/ diff --git a/examples/openai-agent-sdk-js-telemetry/README.md b/examples/openai-agent-sdk-js-telemetry/README.md new file mode 100644 index 0000000..0e128ac --- /dev/null +++ b/examples/openai-agent-sdk-js-telemetry/README.md @@ -0,0 +1,57 @@ +# PromptLayer OpenAI Agents SDK JS Example + +Minimal TypeScript CLI example using PromptLayer's OpenAI Agents SDK tracing integration. + +This example follows the PromptLayer OpenAI Agents SDK JavaScript integration pattern and exports traces to `https://api.promptlayer.com/v1/traces`: + +```ts +import { Agent, run } from "@openai/agents"; +import { instrumentOpenAIAgents } from "promptlayer/openai-agents"; + +const processor = await instrumentOpenAIAgents(); + +const agent = new Agent({ + name: "PromptLayer Demo Agent", + instructions: "You are concise and practical.", + model: "gpt-5", +}); + +const result = await run(agent, "Say hello."); +await processor.forceFlush(); +await processor.shutdown(); +``` + +## Setup + +This docs example intentionally installs the supported PromptLayer JavaScript package from npm through the `promptlayer` dependency in `package.json`. Do not commit a local `file:`, `link:`, or `workspace:` dependency here. + +```bash +cd examples/openai-agent-sdk-js-telemetry +npm install +cp .env.example .env +``` + +Edit `.env`, then run: + +```bash +npm run dev +``` + +You can also pass a custom message: + +```bash +npm run dev -- "What is the weather in Tokyo?" +``` + +## Environment + +- `OPENAI_API_KEY` runs the OpenAI Agents SDK. +- `PROMPTLAYER_API_KEY` enables PromptLayer tracing through `instrumentOpenAIAgents()`. +- `OPENAI_MODEL` optionally overrides the default `gpt-5` model. + +## Notes + +- Requires Node.js 22 or later, matching the OpenAI Agents SDK JavaScript runtime requirement. +- `instrumentOpenAIAgents()` must run before the first agent run. +- `forceFlush()` and `shutdown()` send buffered spans to PromptLayer before the process exits. +- The demo includes a `get_demo_weather` function tool, so tool-call spans are easy to trigger. diff --git a/examples/openai-agent-sdk-js-telemetry/main.ts b/examples/openai-agent-sdk-js-telemetry/main.ts new file mode 100644 index 0000000..f8fc630 --- /dev/null +++ b/examples/openai-agent-sdk-js-telemetry/main.ts @@ -0,0 +1,73 @@ +import "dotenv/config"; + +import { Agent, run, tool } from "@openai/agents"; +import { instrumentOpenAIAgents } from "promptlayer/openai-agents"; +import { z } from "zod"; + +const DEFAULT_MODEL = "gpt-5"; +const DEFAULT_MESSAGE = "Use the weather tool for Tokyo, then summarize the forecast in one sentence."; + +const getDemoWeather = tool({ + name: "get_demo_weather", + description: "Return demo weather for a city.", + parameters: z.object({ + city: z.string().describe("City to look up in the demo forecast."), + }), + execute: async ({ city }) => { + const forecasts: Record = { + "new york": "New York is 61F and cloudy.", + "san francisco": "San Francisco is 58F and breezy.", + tokyo: "Tokyo is 72F with light rain.", + london: "London is 55F and overcast.", + }; + + return forecasts[city.trim().toLowerCase()] ?? `${city} is 68F and clear in the demo forecast.`; + }, +}); + +function requiredEnv(name: string): string { + const value = process.env[name]?.trim(); + if (!value) { + throw new Error(`Missing ${name}. Add it to .env or export it.`); + } + return value; +} + +function parseMessage(): string { + const message = process.argv.slice(2).join(" ").trim(); + return message || DEFAULT_MESSAGE; +} + +async function main(): Promise { + requiredEnv("OPENAI_API_KEY"); + requiredEnv("PROMPTLAYER_API_KEY"); + + const processor = await instrumentOpenAIAgents(); + const model = process.env.OPENAI_MODEL?.trim() || DEFAULT_MODEL; + + const agent = new Agent({ + name: "PromptLayer Demo Agent", + instructions: [ + "You are concise and practical.", + "If the user asks for weather, call get_demo_weather before answering.", + ].join(" "), + model, + modelSettings: { + reasoning: { summary: "auto" }, + }, + tools: [getDemoWeather], + }); + + try { + const result = await run(agent, parseMessage(), { maxTurns: 4 }); + console.log(result.finalOutput); + } finally { + await processor.forceFlush(); + await processor.shutdown(); + } +} + +main().catch((error: unknown) => { + console.error(error instanceof Error ? error.message : error); + process.exitCode = 1; +}); diff --git a/examples/openai-agent-sdk-js-telemetry/package.json b/examples/openai-agent-sdk-js-telemetry/package.json new file mode 100644 index 0000000..0ab30f0 --- /dev/null +++ b/examples/openai-agent-sdk-js-telemetry/package.json @@ -0,0 +1,25 @@ +{ + "name": "openai-agent-sdk-js-telemetry", + "version": "0.1.0", + "private": true, + "type": "module", + "engines": { + "node": ">=22" + }, + "scripts": { + "dev": "npm run build && node dist/main.js", + "build": "tsc", + "start": "node dist/main.js", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@openai/agents": "latest", + "dotenv": "latest", + "promptlayer": "latest", + "zod": "latest" + }, + "devDependencies": { + "@types/node": "latest", + "typescript": "latest" + } +} diff --git a/examples/openai-agent-sdk-js-telemetry/tsconfig.json b/examples/openai-agent-sdk-js-telemetry/tsconfig.json new file mode 100644 index 0000000..62a8d50 --- /dev/null +++ b/examples/openai-agent-sdk-js-telemetry/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "types": ["node"], + "outDir": "dist" + }, + "include": ["main.ts"] +}