Skip to main content

xpander-sdk

Project description

Xpander SDK

Xpander Open Source SDK empowers developers to build intelligent and reliable AI Agents capable of managing complex, multi‑step tasks across diverse systems and platforms. The SDK simplifies challenges like function calling, schema definition, graph enforcement, and prompt group management.

With first‑class support for leading LLM providers such as OpenAI, Amazon Bedrock, Google Gemini, Anthropic Claude, and NVIDIA NIM, the Xpander SDK seamlessly integrates into your existing systems.

ai-agents-with-xpander


📦 Installation

Choose your preferred package manager:

npm

npm install xpander-sdk

pip

pip install xpander-sdk

🚀 Getting Started

Prerequisites

  1. Sign in to app.xpander.ai and create (or pick) an Agent.
  2. Copy the Agent Key and Agent ID from the Agent → Settings page.
  3. Grab the API key for your preferred LLM provider (e.g. OPENAI_API_KEY, GEMINI_API_KEY, etc.).
  4. Install the SDK (see above) and make sure you have Node.js installed – the SDK runs a tiny Node.js runtime under the hood.

🏁 Usage Patterns

Below are the canonical patterns taken from the official documentation for working with LLMs through the Xpander SDK.

1. Single Query (Quick Start)

from xpander_sdk import XpanderClient, LLMProvider
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

xpander_client = XpanderClient(api_key=os.getenv("XPANDER_API_KEY"))
agent          = xpander_client.agents.get(agent_id=os.getenv("XPANDER_AGENT_ID"))
openai_client  = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# A one‑off prompt handled by the agent + tools
response = openai_client.chat.completions.create(
    model="gpt-4o",
    messages=agent.messages,  # current conversation state
    tools=agent.get_tools(llm_provider=LLMProvider.OPEN_AI),
    tool_choice="auto",
    temperature=0.0,
)

# Let the SDK execute the tool calls & keep state in sync
agent.process_llm_response(response.model_dump(), llm_provider=LLMProvider.OPEN_AI)

Tip: agent.process_llm_response(...) is the easiest way to both store the assistant message and immediately run any tool calls it contains – perfect for serverless single‑turn workflows.


2. Real‑Time Event Listener (xpander‑utils)

from xpander_utils.events import (
    XpanderEventListener,
    AgentExecutionResult,
    AgentExecution,
    ExecutionStatus,
)
from xpander_sdk import XpanderClient, LLMProvider
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

listener = XpanderEventListener(
    api_key=os.getenv("XPANDER_API_KEY"),
    organization_id=os.getenv("XPANDER_ORG_ID"),
    agent_id=os.getenv("XPANDER_AGENT_ID"),
)

# Optional helper clients (LLM + Agent)
openai_client   = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
xpander_client  = XpanderClient(api_key=os.getenv("XPANDER_API_KEY"))
agent           = xpander_client.agents.get(agent_id=os.getenv("XPANDER_AGENT_ID"))

def on_execution_request(execution_task: AgentExecution) -> AgentExecutionResult:
    """Runs each time your cloud Agent triggers an execution request."""
    # (1) Ask the LLM what to do next
    response = openai_client.chat.completions.create(
        model="gpt-4o",
        messages=agent.messages,
        tools=agent.get_tools(llm_provider=LLMProvider.OPEN_AI),
        tool_choice="auto",
        temperature=0.0,
    )

    # (2) Persist the assistant message *and* execute any tool calls
    agent.process_llm_response(response.model_dump(), llm_provider=LLMProvider.OPEN_AI)

    # (3) Return the final result back to the platform
    return AgentExecutionResult(
        result=agent.retrieve_execution_result().result,
        status=ExecutionStatus.SUCCEEDED,
    )

# Block forever, listening for events via SSE
listener.register(on_execution_request=on_execution_request)

Why xpander-utils? The XpanderEventListener uses a lightweight Server‑Sent Events (SSE) channel to deliver execution requests to your code with sub‑second latency—perfect for Slack, Teams, and other real‑time chat surfaces. (pypi.org)


3. Multi‑Step Tasks (Long‑running autonomous workflows)

# Describe a complex objective for the agent
multi_step_task = """
Find employees of xpander.ai and their roles.
Then check their LinkedIn profiles for recent updates.
"""

agent.add_task(multi_step_task)  # automatically initialises memory

while not agent.is_finished():
    response = openai_client.chat.completions.create(
        model="gpt-4o",
        messages=agent.messages,
        tools=agent.get_tools(llm_provider=LLMProvider.OPEN_AI),
        tool_choice="auto",
        temperature=0.0,
    )

    agent.process_llm_response(response.model_dump(), llm_provider=LLMProvider.OPEN_AI)

# 🚀 Grab the final result once the agent marks itself as finished
execution_result = agent.retrieve_execution_result()
print(execution_result.status)  # e.g. "SUCCEEDED"
print(execution_result.result)  # your task output

This loop lets the LLM break the objective into sub‑steps, call tools, update memory and eventually mark the task as finished.


4. Complete Example – Gemini via the OpenAI‑compatible API

from xpander_sdk import XpanderClient, LLMProvider
from openai import OpenAI
from dotenv import load_dotenv
from os import environ

load_dotenv()

xpander_client = XpanderClient(api_key=environ["XPANDER_API_KEY"])
gemini_client  = OpenAI(
    api_key=environ["GEMINI_API_KEY"],
    base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
)

agent = xpander_client.agents.get(agent_id=environ["XPANDER_AGENT_ID"])
agent.add_task("Find employees of xpander.ai.")

while not agent.is_finished():
    response = gemini_client.chat.completions.create(
        model="gemini-2.0-flash",
        messages=agent.messages,
        tools=agent.get_tools(llm_provider=LLMProvider.GEMINI_OPEN_AI),
        tool_choice=agent.tool_choice,
        temperature=0.0,
    )

    agent.add_messages(response.model_dump())

    tool_calls = XpanderClient.extract_tool_calls(
        llm_response=response.model_dump(),
        llm_provider=LLMProvider.GEMINI_OPEN_AI,
    )

    agent.run_tools(tool_calls)

print(agent.retrieve_execution_result().result)

This demo showcases full multi‑step orchestration without writing any provider‑specific glue code.


🏆 Best Practices (Provider‑agnostic)

  1. Create a task firstagent.add_task() automatically initialises the agent’s memory and system messages.
  2. Always pass llm_provider when calling agent.get_tools() so the SDK can return the correct schema for the target provider.
  3. Store the raw LLM response with agent.add_messages(...) (or implicitly via agent.process_llm_response). The SDK will convert fields as required.
  4. Extract tool calls with the same provider flag you used for get_tools: XpanderClient.extract_tool_calls(llm_response, llm_provider=...).

Following these rules ensures your code works consistently across OpenAI, Claude, Gemini, Bedrock, and more.


📚 Further Reading


⚙️ Technical Note

The library is generated with Projen and runs inside a tiny Node.js runtime. Ensure you have a recent Node.js version installed for optimal performance.


🤝 Contributing

We welcome contributions to improve the SDK. Please see our CONTRIBUTING.md for guidelines on how to submit improvements and bug fixes.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xpander_sdk-1.52.3.tar.gz (1.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xpander_sdk-1.52.3-py3-none-any.whl (1.7 MB view details)

Uploaded Python 3

File details

Details for the file xpander_sdk-1.52.3.tar.gz.

File metadata

  • Download URL: xpander_sdk-1.52.3.tar.gz
  • Upload date:
  • Size: 1.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for xpander_sdk-1.52.3.tar.gz
Algorithm Hash digest
SHA256 a6724194f07fdbec3429cc77573ce9cc2deec5f060f651ef90321c90d6d53b57
MD5 68b34dd6aaa355caff8f0de29fcfd518
BLAKE2b-256 5c565f3fe9bf340f787fd732f39bb3215dbf7e473e3934526e84c247ae319c88

See more details on using hashes here.

File details

Details for the file xpander_sdk-1.52.3-py3-none-any.whl.

File metadata

  • Download URL: xpander_sdk-1.52.3-py3-none-any.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for xpander_sdk-1.52.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0be6ef893cc974680e98f78db132b24d80c6e7f60aebca0c3d8922412b7b637c
MD5 7682cfd2fe0c54cef30f44b6070707ff
BLAKE2b-256 5a9bdbbd023b31c48932b9e29ee4c0b1ddcc848549e5e7dc3f40abb00ef98378

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page