Is it possible to stream the response back from an AIP Agent?

I have an AIP Agent that respond to queries using tools, context, etc.

Can the response of the agent be streamed to the calling app (via OSDK for example) ?

Are you asking about streaming the final response back from the AIP Agent or getting a live update of which tools are used during an user exchange in the AIP Agent via OSDK?

If it’s the latter, we’ve added the ability to poll for tool uses within the ODSK API, so this should be rolling out soon.

Streaming the response. So that the calling app (e.g. a react app) can show the text as it gets written.

We do support streaming the response via the API call here (public docs)

Here is an end to end example:

Script:

import requests

# Replace with your actual values
BASE_URL = "https://REDACTED.com"
ACCESS_TOKEN = "REDACTED"
HEADERS = {
    "Authorization": f"Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json"
}


def create_session(agent_rid, agent_version="1.0"):
    """Create a new AIP Agent session"""
    url = f"{BASE_URL}/api/v2/aipAgents/agents/{agent_rid}/sessions?preview=true"
    payload = {"agentVersion": agent_version}

    response = requests.post(url, headers=HEADERS, json=payload)
    print(response.text)
    response.raise_for_status()
    return response.json()

def list_all_sessions():
    url = f"{BASE_URL}/api/v2/aipAgents/agents/allSessions?preview=true"
    response = requests.get(url, headers=HEADERS)
    response.raise_for_status()
    return response.json()

def list_agent_sessions(agent_rid):
    url = f"{BASE_URL}/api/v2/aipAgents/agents/{agent_rid}/sessions?preview=true"
    response = requests.get(url, headers=HEADERS)
    response.raise_for_status()
    return response.json()

def get_session_details(agent_rid, session_rid):
    url = f"{BASE_URL}/api/v2/aipAgents/agents/{agent_rid}/sessions/{session_rid}?preview=true"
    response = requests.get(url, headers=HEADERS)
    response.raise_for_status()
    return response.json()

def blocking_continue_session(base_url, agent_rid, session_rid, access_token, user_message, parameter_inputs=None):
    url = f"{base_url}/api/v2/aipAgents/agents/{agent_rid}/sessions/{session_rid}/blockingContinue"
    headers = {
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json"
    }
    params = {"preview": "true"}
    payload = {
        "userInput": {"text": user_message}
    }
    if parameter_inputs:
        payload["parameterInputs"] = parameter_inputs

    response = requests.post(url, headers=headers, params=params, json=payload)
    response.raise_for_status()
    return response.json()

def streaming_continue_session(base_url, agent_rid, session_rid, access_token, user_message, parameter_inputs=None, message_id=None, session_trace_id=None):
    url = f"{base_url}/api/v2/aipAgents/agents/{agent_rid}/sessions/{session_rid}/streamingContinue"
    headers = {
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json"
    }
    params = {"preview": "true"}
    payload = {
        "userInput": {"text": user_message}
    }
    if message_id:
        payload["messageId"] = message_id
    if session_trace_id:
        payload["sessionTraceId"] = session_trace_id
    if parameter_inputs:
        payload["parameterInputs"] = parameter_inputs

    with requests.post(url, headers=headers, params=params, json=payload, stream=True) as response:
        response.raise_for_status()
        for chunk in response.iter_content(chunk_size=None):
            if chunk:
                print(chunk.decode(), end="", flush=True)  # Streamed markdown text

# Example usage:
if __name__ == "__main__":
    agent_rid = "ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7"  # Replace with your agent RID

    # Create a new session
    print("Creating new session...")
    session = create_session(agent_rid)
    session_rid = session["rid"]
    print(f"Created session: {session_rid}")

    # List all sessions
    all_sessions = list_all_sessions()
    print("All Sessions:", all_sessions)

    # List sessions for a specific agent
    agent_sessions = list_agent_sessions(agent_rid)
    print(f"Sessions for agent {agent_rid}:", agent_sessions)

    # Get details for a specific session
    session_details = get_session_details(agent_rid, session_rid)
    print(f"Details for session {session_rid}:", session_details)

    result = blocking_continue_session(BASE_URL, agent_rid, session_rid, ACCESS_TOKEN, "What is the status of my order?")
    print(result["agentMarkdownResponse"])

    streaming_continue_session(BASE_URL, agent_rid, session_rid, ACCESS_TOKEN, "What is the status of my order?")

Response:

Creating new session...
{
    "rid": "ri.aip-agents..session.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7",
    "metadata": {
        "title": "",
        "createdTime": "2025-06-10T16:16:49.209139382Z",
        "updatedTime": "2025-06-10T16:16:49.209139382Z",
        "messageCount": 0,
        "estimatedExpiresTime": "9999-12-31T23:59:59Z"
    },
    "agentRid": "ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7",
    "agentVersion": "1.0"
}
Created session: ri.aip-agents..session.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7

All Sessions: {'data': [
        {'rid': 'ri.aip-agents..session.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'metadata': {'title': '', 'createdTime': '2025-06-10T16: 16: 49.209139382Z', 'updatedTime': '2025-06-10T16: 16: 49.209139382Z', 'messageCount': 0, 'estimatedExpiresTime': '9999-12-31T23: 59: 59Z'
            }, 'agentRid': 'ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'agentVersion': '1.0'
        },
        {'rid': 'ri.aip-agents..session.2b37266b-f961-48a0-86b5-8dca57284e09', 'metadata': {'title': '', 'createdTime': '2025-06-10T16: 13: 50.522424672Z', 'updatedTime': '2025-06-10T16: 13: 50.522424672Z', 'messageCount': 0, 'estimatedExpiresTime': '9999-12-31T23: 59: 59Z'
            }, 'agentRid': 'ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'agentVersion': '1.0'
        },
        {'rid': 'ri.aip-agents..session.facfd487-b4c9-403f-a4b5-7cc933f1550f', 'metadata': {'title': '', 'createdTime': '2025-06-10T16: 13: 24.758910688Z', 'updatedTime': '2025-06-10T16: 13: 24.758910688Z', 'messageCount': 0, 'estimatedExpiresTime': '9999-12-31T23: 59: 59Z'
            }, 'agentRid': 'ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'agentVersion': '1.0'
        }
    ]
}

Sessions for agent ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7: {'data': [
        {'rid': 'ri.aip-agents..session.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'metadata': {'title': '', 'createdTime': '2025-06-10T16: 16: 49.209139382Z', 'updatedTime': '2025-06-10T16: 16: 49.209139382Z', 'messageCount': 0, 'estimatedExpiresTime': '9999-12-31T23: 59: 59Z'
            }, 'agentRid': 'ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'agentVersion': '1.0'
        },
        {'rid': 'ri.aip-agents..session.2b37266b-f961-48a0-86b5-8dca57284e09', 'metadata': {'title': '', 'createdTime': '2025-06-10T16: 13: 50.522424672Z', 'updatedTime': '2025-06-10T16: 13: 50.522424672Z', 'messageCount': 0, 'estimatedExpiresTime': '9999-12-31T23: 59: 59Z'
            }, 'agentRid': 'ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'agentVersion': '1.0'
        },
        {'rid': 'ri.aip-agents..session.facfd487-b4c9-403f-a4b5-7cc933f1550f', 'metadata': {'title': '', 'createdTime': '2025-06-10T16: 13: 24.758910688Z', 'updatedTime': '2025-06-10T16: 13: 24.758910688Z', 'messageCount': 0, 'estimatedExpiresTime': '9999-12-31T23: 59: 59Z'
            }, 'agentRid': 'ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'agentVersion': '1.0'
        }
    ]
}

Details for session ri.aip-agents..session.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7: {'rid': 'ri.aip-agents..session.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'metadata': {'title': '', 'createdTime': '2025-06-10T16: 16: 49.209139382Z', 'updatedTime': '2025-06-10T16: 16: 49.209139382Z', 'messageCount': 0, 'estimatedExpiresTime': '9999-12-31T23: 59: 59Z'
    }, 'agentRid': 'ri.aip-agents..agent.de694dc6-aaaa-bbbb-cccc-9bb98049d1f7', 'agentVersion': '1.0'
}

I'm sorry, but I can't check the status of your order as I don't have access to personal data or external systems. You might want to check the status by logging into the website where you placed the order, or by contacting their customer service directly.

I'm unable to check the status of your order as I don't have access to personal data or external systems. To find out the status, you can try logging into the website where you made the purchase or contact their customer service for assistance.

Note that those endpoints are part of the Platform SDK available alongside the Ontology SDK.

https://github.com/palantir/foundry-platform-typescript
https://www.npmjs.com/package/@osdk/foundry.aipagents

3 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.