feat: Add support for Conversations in Responses API (#3743)

# What does this PR do?
This PR adds support for Conversations in Responses.

<!-- If resolving an issue, uncomment and update the line below -->
<!-- Closes #[issue-number] -->

## Test Plan
Unit tests
Integration tests

<Details>
<Summary>Manual testing with this script: (click to expand)</Summary>

```python
from openai import OpenAI

client = OpenAI()
client = OpenAI(base_url="http://localhost:8321/v1/", api_key="none")

def test_conversation_create():
    print("Testing conversation create...")
    conversation = client.conversations.create(
        metadata={"topic": "demo"},
        items=[
            {"type": "message", "role": "user", "content": "Hello!"}
        ]
    )
    print(f"Created: {conversation}")
    return conversation

def test_conversation_retrieve(conv_id):
    print(f"Testing conversation retrieve for {conv_id}...")
    retrieved = client.conversations.retrieve(conv_id)
    print(f"Retrieved: {retrieved}")
    return retrieved

def test_conversation_update(conv_id):
    print(f"Testing conversation update for {conv_id}...")
    updated = client.conversations.update(
        conv_id,
        metadata={"topic": "project-x"}
    )
    print(f"Updated: {updated}")
    return updated

def test_conversation_delete(conv_id):
    print(f"Testing conversation delete for {conv_id}...")
    deleted = client.conversations.delete(conv_id)
    print(f"Deleted: {deleted}")
    return deleted

def test_conversation_items_create(conv_id):
    print(f"Testing conversation items create for {conv_id}...")
    items = client.conversations.items.create(
        conv_id,
        items=[
            {
                "type": "message",
                "role": "user",
                "content": [{"type": "input_text", "text": "Hello!"}]
            },
            {
                "type": "message",
                "role": "user",
                "content": [{"type": "input_text", "text": "How are you?"}]
            }
        ]
    )
    print(f"Items created: {items}")
    return items

def test_conversation_items_list(conv_id):
    print(f"Testing conversation items list for {conv_id}...")
    items = client.conversations.items.list(conv_id, limit=10)
    print(f"Items list: {items}")
    return items

def test_conversation_item_retrieve(conv_id, item_id):
    print(f"Testing conversation item retrieve for {conv_id}/{item_id}...")
    item = client.conversations.items.retrieve(conversation_id=conv_id, item_id=item_id)
    print(f"Item retrieved: {item}")
    return item

def test_conversation_item_delete(conv_id, item_id):
    print(f"Testing conversation item delete for {conv_id}/{item_id}...")
    deleted = client.conversations.items.delete(conversation_id=conv_id, item_id=item_id)
    print(f"Item deleted: {deleted}")
    return deleted

def test_conversation_responses_create():
    print("\nTesting conversation create for a responses example...")
    conversation = client.conversations.create()
    print(f"Created: {conversation}")

    response = client.responses.create(
      model="gpt-4.1",
      input=[{"role": "user", "content": "What are the 5 Ds of dodgeball?"}],
      conversation=conversation.id,
    )
    print(f"Created response: {response} for conversation {conversation.id}")

    return response, conversation

def test_conversations_responses_create_followup(
        conversation,
        content="Repeat what you just said but add 'this is my second time saying this'",
    ):
    print(f"Using: {conversation.id}")

    response = client.responses.create(
      model="gpt-4.1",
      input=[{"role": "user", "content": content}],
      conversation=conversation.id,
    )
    print(f"Created response: {response} for conversation {conversation.id}")

    conv_items = client.conversations.items.list(conversation.id)
    print(f"\nRetrieving list of items for conversation {conversation.id}:")
    print(conv_items.model_dump_json(indent=2))

def test_response_with_fake_conv_id():
    fake_conv_id = "conv_zzzzzzzzz5dc81908289d62779d2ac510a2b0b602ef00a44"
    print(f"Using {fake_conv_id}")
    try:
        response = client.responses.create(
          model="gpt-4.1",
          input=[{"role": "user", "content": "say hello"}],
          conversation=fake_conv_id,
        )
        print(f"Created response: {response} for conversation {fake_conv_id}")
    except Exception as e:
        print(f"failed to create response for conversation {fake_conv_id} with error {e}")


def main():
    print("Testing OpenAI Conversations API...")

    # Create conversation
    conversation = test_conversation_create()
    conv_id = conversation.id

    # Retrieve conversation
    test_conversation_retrieve(conv_id)

    # Update conversation
    test_conversation_update(conv_id)

    # Create items
    items = test_conversation_items_create(conv_id)

    # List items
    items_list = test_conversation_items_list(conv_id)

    # Retrieve specific item
    if items_list.data:
        item_id = items_list.data[0].id
        test_conversation_item_retrieve(conv_id, item_id)

        # Delete item
        test_conversation_item_delete(conv_id, item_id)

    # Delete conversation
    test_conversation_delete(conv_id)

    response, conversation2 = test_conversation_responses_create()
    print('\ntesting reseponse retrieval')
    test_conversation_retrieve(conversation2.id)

    print('\ntesting responses follow up')
    test_conversations_responses_create_followup(conversation2)

    print('\ntesting responses follow up x2!')

    test_conversations_responses_create_followup(
        conversation2,
        content="Repeat what you just said but add 'this is my third time saying this'",
    )

    test_response_with_fake_conv_id()

    print("All tests completed!")


if __name__ == "__main__":
    main()
```
</Details>

---------

Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
Co-authored-by: Ashwin Bharambe <ashwin.bharambe@gmail.com>
This commit is contained in:
Francisco Arceo 2025-10-10 14:57:40 -04:00 committed by GitHub
parent 932fea813a
commit e7d21e1ee3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
41 changed files with 6221 additions and 19 deletions

View file

@ -0,0 +1,687 @@
{
"test_id": null,
"request": {
"method": "POST",
"url": "https://generativelanguage.googleapis.com/v1beta/openai/v1/models",
"headers": {},
"body": {},
"endpoint": "/v1/models",
"model": ""
},
"response": {
"body": [
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/embedding-gecko-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Embedding Gecko"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-pro-preview-03-25",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Pro Preview 03-25"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-preview-05-20",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Preview 05-20"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-lite-preview-06-17",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash-Lite Preview 06-17"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-pro-preview-05-06",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Pro Preview 05-06"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-pro-preview-06-05",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Pro Preview"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-pro",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Pro"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-exp",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash Experimental"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash 001"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-exp-image-generation",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash (Image Generation) Experimental"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-lite-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash-Lite 001"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-lite",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash-Lite"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-preview-image-generation",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash Preview Image Generation"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-lite-preview-02-05",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash-Lite Preview 02-05"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-lite-preview",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash-Lite Preview"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-pro-exp",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Pro Experimental"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-pro-exp-02-05",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Pro Experimental 02-05"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-exp-1206",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini Experimental 1206"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-thinking-exp-01-21",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Preview 05-20"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-thinking-exp",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Preview 05-20"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-thinking-exp-1219",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Preview 05-20"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-preview-tts",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Preview TTS"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-pro-preview-tts",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Pro Preview TTS"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/learnlm-2.0-flash-experimental",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "LearnLM 2.0 Flash Experimental"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemma-3-1b-it",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemma 3 1B"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemma-3-4b-it",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemma 3 4B"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemma-3-12b-it",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemma 3 12B"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemma-3-27b-it",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemma 3 27B"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemma-3n-e4b-it",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemma 3n E4B"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemma-3n-e2b-it",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemma 3n E2B"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-flash-latest",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini Flash Latest"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-flash-lite-latest",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini Flash-Lite Latest"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-pro-latest",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini Pro Latest"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-lite",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash-Lite"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-image-preview",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Nano Banana"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-image",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Nano Banana"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-preview-09-2025",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Preview Sep 2025"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-lite-preview-09-2025",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash-Lite Preview Sep 2025"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-robotics-er-1.5-preview",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini Robotics-ER 1.5 Preview"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-computer-use-preview-10-2025",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Computer Use Preview 10-2025"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/embedding-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Embedding 001"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/text-embedding-004",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Text Embedding 004"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-embedding-exp-03-07",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini Embedding Experimental 03-07"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-embedding-exp",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini Embedding Experimental"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-embedding-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini Embedding 001"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/aqa",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Model that performs Attributed Question Answering."
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/imagen-3.0-generate-002",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Imagen 3.0"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/imagen-4.0-generate-preview-06-06",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Imagen 4 (Preview)"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/imagen-4.0-ultra-generate-preview-06-06",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Imagen 4 Ultra (Preview)"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/imagen-4.0-generate-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Imagen 4"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/imagen-4.0-ultra-generate-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Imagen 4 Ultra"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/imagen-4.0-fast-generate-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Imagen 4 Fast"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/veo-2.0-generate-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Veo 2"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/veo-3.0-generate-preview",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Veo 3"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/veo-3.0-fast-generate-preview",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Veo 3 fast"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/veo-3.0-generate-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Veo 3"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/veo-3.0-fast-generate-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Veo 3 fast"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-preview-native-audio-dialog",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Preview Native Audio Dialog"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-exp-native-audio-thinking-dialog",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Exp Native Audio Thinking Dialog"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.0-flash-live-001",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.0 Flash 001"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-live-2.5-flash-preview",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini Live 2.5 Flash Preview"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-live-preview",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Live Preview"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-native-audio-latest",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Native Audio Latest"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/gemini-2.5-flash-native-audio-preview-09-2025",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Gemini 2.5 Flash Native Audio Preview 09-2025"
}
},
{
"__type__": "openai.types.model.Model",
"__data__": {
"id": "models/lyria-realtime-exp",
"created": null,
"object": "model",
"owned_by": "google",
"display_name": "Lyria Realtime Experimental"
}
}
],
"is_streaming": false
},
"id_normalization_mapping": {}
}