{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Using Opik with OpenAI Agents\n", "\n", "Opik integrates with OpenAI Agents to provide a simple way to log traces and analyse for all OpenAI LLM calls. This works for all OpenAI models, including if you are using the streaming API.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating an account on Comet.com\n", "\n", "[Comet](https://www.comet.com/site?from=llm&utm_source=opik&utm_medium=colab&utm_content=openai&utm_campaign=opik) provides a hosted version of the Opik platform, [simply create an account](https://www.comet.com/signup?from=llm&utm_source=opik&utm_medium=colab&utm_content=openai&utm_campaign=opik) and grab your API Key.\n", "\n", "> You can also run the Opik platform locally, see the [installation guide](https://www.comet.com/docs/opik/self-host/overview/?from=llm&utm_source=opik&utm_medium=colab&utm_content=openai&utm_campaign=opik) for more information." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%pip install --upgrade opik openai-agents" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import opik\n", "\n", "opik.configure(use_local=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Preparing our environment\n", "\n", "First, we will set up our OpenAI API keys." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import os\n", "import getpass\n", "\n", "if \"OPENAI_API_KEY\" not in os.environ:\n", " os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"Enter your OpenAI API key: \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Logging traces\n", "\n", "In order to log traces to Opik, we need to wrap our OpenAI calls with the `track_openai` function:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from agents import Agent, Runner\n", "from agents import set_trace_processors\n", "from opik.integrations.openai.agents import OpikTracingProcessor\n", "\n", "os.environ[\"OPIK_PROJECT_NAME\"] = \"openai-agents-demo\"\n", "\n", "set_trace_processors(processors=[OpikTracingProcessor()])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Create and run your agent\n", "agent = Agent(\n", " name=\"Creative Assistant\", \n", " instructions=\"You are a creative writing assistant that helps users with poetry and creative content.\",\n", " model=\"gpt-4o-mini\"\n", ")\n", "\n", "# Use async Runner.run() instead of run_sync() in Jupyter notebooks\n", "result = await Runner.run(agent, \"Write a haiku about recursion in programming.\")\n", "print(result.final_output)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using it with the `track` decorator\n", "\n", "If you have multiple steps in your LLM pipeline, you can use the `track` decorator to log the traces for each step. If OpenAI is called within one of these steps, the LLM call with be associated with that corresponding step:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from agents import Agent, Runner, function_tool\n", "from opik import track\n", "\n", "@function_tool\n", "def calculate_average(numbers: list[float]) -> float:\n", " return sum(numbers) / len(numbers)\n", "\n", "@function_tool \n", "def get_recommendation(topic: str, user_level: str) -> str:\n", " recommendations = {\n", " \"python\": {\n", " \"beginner\": \"Start with Python.org's tutorial, then try Python Crash Course book. Practice with simple scripts and built-in functions.\",\n", " \"intermediate\": \"Explore frameworks like Flask/Django, learn about decorators, context managers, and dive into Python's data structures.\",\n", " \"advanced\": \"Study Python internals, contribute to open source, learn about metaclasses, and explore performance optimization.\"\n", " },\n", " \"machine learning\": {\n", " \"beginner\": \"Start with Andrew Ng's Coursera course, learn basic statistics, and try scikit-learn with simple datasets.\",\n", " \"intermediate\": \"Dive into deep learning with TensorFlow/PyTorch, study different algorithms, and work on real projects.\",\n", " \"advanced\": \"Research latest papers, implement algorithms from scratch, and contribute to ML frameworks.\"\n", " }\n", " }\n", " \n", " topic_lower = topic.lower()\n", " level_lower = user_level.lower()\n", " \n", " if topic_lower in recommendations and level_lower in recommendations[topic_lower]:\n", " return recommendations[topic_lower][level_lower]\n", " else:\n", " return f\"For {topic} at {user_level} level: Focus on fundamentals, practice regularly, and build projects to apply your knowledge.\"\n", "\n", "def create_advanced_agent():\n", " \"\"\"Create an advanced agent with tools and comprehensive instructions.\"\"\"\n", " instructions = \"\"\"\n", " You are an expert programming tutor and learning advisor. You have access to tools that help you:\n", " 1. Calculate averages for performance metrics, grades, or other numerical data\n", " 2. Provide personalized learning recommendations based on topics and user experience levels\n", " \n", " Your role:\n", " - Help users learn programming concepts effectively\n", " - Provide clear, beginner-friendly explanations when needed\n", " - Use your tools when appropriate to give concrete help\n", " - Offer structured learning paths and resources\n", " - Be encouraging and supportive\n", " \n", " When users ask about:\n", " - Programming languages: Use get_recommendation to provide tailored advice\n", " - Performance or scores: Use calculate_average if numbers are involved\n", " - Learning paths: Combine your knowledge with tool-based recommendations\n", " \n", " Always explain your reasoning and make your responses educational.\n", " \"\"\"\n", " \n", " return Agent(\n", " name=\"AdvancedProgrammingTutor\",\n", " instructions=instructions,\n", " model=\"gpt-4o-mini\",\n", " tools=[calculate_average, get_recommendation]\n", " )\n", "\n", "advanced_agent = create_advanced_agent()\n", "\n", "advanced_queries = [\n", " \"I'm new to Python programming. Can you tell me about it?\",\n", " \"I got these test scores: 85, 92, 78, 96, 88. What's my average and how am I doing?\",\n", " \"I know some Python basics but want to learn machine learning. What should I do next?\",\n", " \"Can you help me calculate the average of these response times: 1.2, 0.8, 1.5, 0.9, 1.1 seconds? And tell me if that's good performance?\"\n", "]\n", "\n", "for i, query in enumerate(advanced_queries, 1):\n", " print(f\"\\nšŸ“ Query {i}: {query}\")\n", " result = await Runner.run(advanced_agent, query)\n", " print(f\"šŸ¤– Response: {result.final_output}\")\n", " print(\"=\" * 80)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The trace can now be viewed in the UI:\n", "\n", "![OpenAI Integration](https://raw.githubusercontent.com/comet-ml/opik/main/apps/opik-documentation/documentation/static/img/cookbook/openai_agents_cookbook.png)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.1" } }, "nbformat": 4, "nbformat_minor": 4 }