Published on

Creating an OpenAI Law Copilot - A Guide to Building an AI Legal Assistant

  • avatar
    Vadim Nicolai
OpenAI Law Copilot

The integration of AI in legal services is a rapidly growing field. Leveraging OpenAI's capabilities, one can create a Law Copilot, an AI legal assistant, to handle various legal tasks efficiently. The following article will guide you through setting up such a system using OpenAI's API.

  1. Knowledge Integration Using GDPR Document:

    The integration of the General Data Protection Regulation (GDPR) document as the knowledge base is a strategic choice for your AI legal assistant. GDPR is a critical regulation in the field of data protection and privacy in the European Union and the European Economic Area. It also addresses the transfer of personal data outside the EU and EEA areas. Here's how you can integrate this document into your AI legal assistant:

    • Document Selection: The document "32016R0679" represents the legal act of GDPR. This comprehensive document covers various aspects of data protection and privacy laws, making it an invaluable resource for a legal AI assistant focusing on these areas.

    • Uploading the GDPR Document: The GDPR document is read using fs.createReadStream and uploaded to OpenAI using its API. This process makes the detailed information and stipulations of GDPR available to the AI assistant.

    • Assistant Configuration for GDPR: After uploading the GDPR document, the AI assistant is created with specific instructions to refer to this document for legal queries related to data protection and privacy. By linking the assistant with the GDPR document (using file_ids), it gains the ability to provide information and advice based on this critical regulation.

    • Storing and Retrieving the Assistant ID: The unique ID of the AI assistant is stored in a key-value store (@vercel/kv) for easy retrieval and interaction in future sessions.

    Here's the updated code snippet reflecting these steps:

    // ... (previous code for setup)
    try {
      // Reading and uploading the GDPR document
      const file = await openai.files.create({
        file: fs.createReadStream('Document_32016R0679.pdf'),
        purpose: 'assistants',
      // Creating an assistant specialized in GDPR
      const assistant = await openai.beta.assistants.create({
        instructions: `
          You are a legal assistant specialized in GDPR. Use the GDPR document as a reference to address client inquiries about data protection and privacy.
        model: 'gpt-4-1106-preview',
        tools: [{ type: 'retrieval' }],
        file_ids: [file.id],
      // Storing the assistant's ID
      kv.set(ASSISTANT_ID, assistant.id)
      // ... (rest of the code)
    } catch (error) {
    // ... (rest of the code)

By leveraging the GDPR document, the AI legal assistant becomes a powerful tool for addressing inquiries related to data protection and privacy laws, a significant area of interest and concern in today's digital world.

Continuing with our guide on setting up an OpenAI Law CoPilot, let's delve into handling user interactions through POST requests. This step is crucial as it determines how the AI assistant receives and processes legal queries.

Handling User Queries with POST Requests:

The POST request handler plays a pivotal role in the interactivity of the AI assistant. It's responsible for receiving user queries, processing them, and providing the AI-generated legal advice or information. Here's how it's set up:

  1. Fetching User Content:

    • The function starts by extracting the content of the user's request. This content typically contains the legal question or request that the user wants the AI to address.
  2. Creating Key-Value Store and OpenAI Client:

    • A key-value store is initialized using createClient from @vercel/kv. This store manages important data like the assistant's ID and conversation thread IDs.
    • An OpenAI client is set up with the API key, facilitating communication with OpenAI's servers.
  3. Retrieving the Assistant ID:

    • The assistant ID, stored during the assistant's creation process, is retrieved from the key-value store. This ID links the user's query to the correct AI assistant instance.
  4. Creating and Running the AI Conversation Thread:

    • The createAndRun method from OpenAI's API is used to create a conversation thread. This method sends the user's query to the AI assistant and fetches the response.
    • The conversation thread includes a pre-defined instruction ensuring that if there's a reference to a specific legal article, it should be included in the response. This ensures detailed and precise legal information.
  5. Storing the Conversation IDs:

    • The IDs for the run and thread are stored for maintaining a continuous conversation context and for tracking purposes.
  6. Returning the AI Response:

    • Finally, the AI's response is sent back to the client, which the user sees as the AI's legal advice or information.

Here's the relevant code snippet:

import { NextResponse } from "next/server";
import OpenAI from "openai";
import { createClient } from "@vercel/kv";

export async function POST(req: Request) {
  // Extract content and set up clients
  // ...

  const run = await openai.beta.threads.createAndRun({
    // Create and run the conversation thread
    // ...

  // Store conversation IDs and return response
  // ...

This POST request handler is a critical component of the Law CoPilot system, enabling the AI to interact with and respond to user queries effectively. It's the bridge that connects users' legal inquiries to the AI's expertise, making the system an invaluable tool for those seeking legal assistance.

Continuing our exploration of setting up an OpenAI Law CoPilot, it's important to address the nuances of interacting with the AI's conversation threads. Specifically, the way the thread status is managed after its creation is key to ensuring a smooth user experience.

Managing AI Conversation Threads: Status and Refetching

Once a conversation thread is created using the POST request handler, it's crucial to understand that the thread's status is initially set to "queued". This status implies that the AI's response is not immediately available and requires some time to process. To handle this effectively, a mechanism to refetch the thread's status periodically is needed. This approach ensures that the user receives the AI's response as soon as it's ready.

  1. Thread Status Management:

    • After the thread creation, the status is initially "queued", meaning the AI is processing the user's query.
    • An efficient way to manage this is by implementing a GET request handler that periodically checks the thread's status until the AI's response is ready.
  2. Implementing the GET Request Handler:

    • The GET handler retrieves the thread ID from the key-value store.
    • It then uses the OpenAI client to fetch the messages from the thread associated with this ID.
    • This handler plays a crucial role in periodically checking the thread's status and fetching the AI's response once it's available.
  3. Refetching Interval:

    • To ensure timely retrieval of the AI's response, the GET handler should be called at regular intervals. This could be based on a pre-defined refetch interval, ensuring that the system checks back with the AI service regularly until the response is available.

Here's the code snippet for the GET request handler:

import { NextResponse } from 'next/server';
import OpenAI from 'openai';
import { createClient } from '@vercel/kv';

export async function GET(req: Request) {
  // Setup key-value client and OpenAI client
  // ...

  const threadId = (await kv.get('threadId')) as string;

  // Fetch messages from the thread
  const messages = await openai.beta.threads.messages.list(threadId);

  // Return the AI's messages
  return NextResponse.json({ messages });

Incorporating this GET request handler into the Law CoPilot system is essential for ensuring that the AI's responses, especially those that require more processing time, are delivered efficiently to the user. This method represents a proactive approach to managing AI interactions, aligning with the dynamic nature of legal queries and the expectations of users seeking timely legal assistance.


The creation of an OpenAI Law CoPilot represents a significant stride in integrating AI with legal services. By harnessing OpenAI's advanced capabilities, this system offers a responsive and intelligent AI legal assistant capable of efficiently handling a variety of legal tasks. The integration of a comprehensive knowledge base like the GDPR document ensures that the assistant can provide informed and relevant legal advice. Moreover, the implementation of POST and GET request handlers allows for smooth and effective user interactions with the AI, accommodating the dynamic nature of legal queries.

This guide, detailing the setup process and code snippets, demonstrates the practical application of generative AI in creating a conversational legal assistant. As the field of AI continues to evolve, the potential for such systems to revolutionize various sectors, including legal services, is immense. The OpenAI Law CoPilot is not just a tool but a forerunner in the journey towards more accessible and efficient legal assistance, powered by the transformative capabilities of artificial intelligence.

The source code is available on GitHub.