Skip to main content

MseeP.ai Security Assessment Badge

unifai-sdk-py

unifai-sdk-py is the Python SDK for UnifAI, an AI native platform for dynamic tools and agent to agent communication.

Installation

pip install unifai-sdk

Getting your UnifAI API key

You can get your API key for free from UnifAI.

There are two types of API keys:

  • Agent API key: for using toolkits in your own agents.

  • Toolkit API key: for creating toolkits that can be used by other agents.

Using tools

To use tools in your agents, you need an agent API key. You can get an agent API key for free at UnifAI.

import unifai

tools = unifai.Tools(api_key='xxx')

Tool Types

UnifAI provides a flexible system for integrating AI tools in your applications:

Dynamic Tools

Dynamic tools are enabled by default, allowing agents to discover and use tools on-the-fly based on the task at hand. Tools will not be visible to agents directly. Instead, agents will see two functions only: one to search tools, one to use tools. Agents will be able to search for tools based on sementic query, get a list of relevant tools, and use tools dynamically.

# Enable dynamic tools (default behavior)
dynamic_tools = await tools.get_tools(dynamic_tools=True)

Static Toolkits

Static toolkits allow you to specify entire toolkits to be exposed to agents so they can be used without search.

static_tools = await tools.get_tools(
    dynamic_tools=False,  # Optional: disable dynamic tools
    static_toolkits=["1", "2"]
)

You can find available toolkits at https://app.unifai.network/toolkits.

Static Actions

Static actions provide granular control, allowing you to specify individual actions (tools) to be exposed to agents.

static_tools = await tools.get_tools(
    dynamic_tools=False,  # Optional: disable dynamic tools
    static_actions=["action_id_1", "action_id_2"]
)

You can find available actions at https://app.unifai.network/actions.

Mixed tools

You can combine these approaches for a customized tool setup:

combined_tools = await tools.get_tools(
    dynamic_tools=True,
    static_toolkits=["essential_toolkit_id"],
    static_actions=["critical_action_id"]
)

Passing tools to LLM

You can pass the tools to any OpenAI compatible API. Popular options include:

  • Model providers' native API
  • Litellm: A library that provides a unified OpenAI compatible API to most LLM providers
  • OpenRouter: A service that gives you access to most LLMs through a single OpenAI compatible API

The tools will work with any API that follows the OpenAI function calling format. This gives you the flexibility to choose the best LLM for your needs while keeping your tools working consistently.

response = await litellm.acompletion(
    model="anthropic/claude-3-7-sonnet-20250219",
    messages=[{"content": "Can you tell me what is trending on Google today?", "role": "user"}],
    tools=await tools.get_tools(),
)

If the response contains tool calls, you can pass them to the tools.call_tools method to get the results. The output will be a list of messages containing the results of the tool calls that can be concatenated to the original messages and passed to the LLM again.

results = await tools.call_tools(response.choices[0].message.tool_calls)
messages.extend(results)
# messages can be passed to the LLM again now

Passing the tool calls results back to the LLM might get you more function calls, and you can keep calling the tools until you get a response that doesn't contain any tool calls. For example:

messages = [{"content": "Can you tell me what is trending on Google today?", "role": "user"}]
while True:
    response = await litellm.acompletion(
        model="anthropic/claude-3-7-sonnet-20250219",
        messages=messages,
        tools=await tools.get_tools(),
    )
    messages.append(response.choices[0].message)
    results = await tools.call_tools(response.choices[0].message.tool_calls)
    if len(results) == 0:
        break
    messages.extend(results)

Using tools in MCP clients

We provide a MCP server to access tools in any MCP clients such as Claude Desktop.

The easiest way to run the server is using uv, see Instaling uv if you haven't installed it yet.

Then in your MCP client config:

{
  "mcpServers": {
    "unifai": {
      "command": "uvx",
      "args": [
        "--from",
        "unifai-sdk",
        "unifai-tools-mcp"
      ],
      "env": {
        "UNIFAI_AGENT_API_KEY": ""
      }
    }
  }
}

Now your MCP client will be able to access all the tools in UnifAI automatically through dynamic tools.

You can use environment variable to choose dynamic/static tools exposed by the MCP server, for example:

{
  "mcpServers": {
    "unifai": {
      "command": "uvx",
      "args": [
        "--from",
        "unifai-sdk",
        "unifai-tools-mcp"
      ],
      "env": {
        "UNIFAI_AGENT_API_KEY": "",
        "UNIFAI_DYNAMIC_TOOLS": "true",
        "UNIFAI_STATIC_TOOLKITS": "1,2,3",
        "UNIFAI_STATIC_ACTIONS": "ACTION_A,ACTION_B"
      }
    }
  }
}

Creating tools

Anyone can create dynamic tools in UnifAI by creating a toolkit.

A toolkit is a collection of tools that are connected to the UnifAI infrastructure, and can be searched and used by agents dynamically.

Initialize a toolkit client with your toolkit API key. You can get a toolkit API key for free at UnifAI.

import unifai

toolkit = unifai.Toolkit(api_key='xxx')

Update the toolkit name and/or description if you need:

await toolkit.update_toolkit(name="EchoChamber", description="What's in, what's out.")

or running it as a synchronous method with asyncio.run():

asyncio.run(toolkit.update_toolkit(name="EchoChamber", description="What's in, what's out."))

Register action handlers:

@toolkit.action(
    action="echo",
    action_description='Echo the message',
    payload_description={"content": {"type": "string"}},
)
async def echo(ctx: unifai.ActionContext, payload={}): # can be a sync function too
    return ctx.Result(f'You are agent <{ctx.agent_id}>, you said "{payload.get("content")}".')

Note that payload_description can be any string or a dict that contains enough information for agents to understand the payload format. It doesn't have to be in a certain format, as long as agents can understand it as natural language and generate the correct payload. Think of it as the comments and docs for your API, agents read it and decide what parameters to use. In practice we recommend using JSON schema to match the format of training data.

Start the toolkit:

await toolkit.run()

or running it as a synchronous method with asyncio.run():

asyncio.run(toolkit.run())

Examples

You can find examples in the examples directory.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

Metadata

Release files for unifai-sdk 0.3.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for unifai-sdk 0.3.3
File Size Uploaded Provenance
unifai_sdk-0.3.3.tar.gz 207.0 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for unifai-sdk 0.3.3
File Interpreter ABI Platform
unifai_sdk-0.3.3-py3-none-any.whl Python 3 none any Details

Total release size: 254.9 kB

Release files / unifai_sdk-0.3.3.tar.gz

Download URL unifai_sdk-0.3.3.tar.gz
Size 207.0 kB
Tags Source
SHA-256 checksum
How to use checksums
7d1feb08fd06787906b66543a14f7acd4d7c1470941cd56b526cd0de2a4e8358
BLAKE2b-256 checksum
How to use checksums
67c7fad83fb35ca1efc520763f27fd8bb5a7825212bc9c009bc2c5845b7701a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 23, 2025.

Transparency log

Release files / unifai_sdk-0.3.3-py3-none-any.whl

Download URL unifai_sdk-0.3.3-py3-none-any.whl
Size 47.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fd222af3ae06d96feab77cfc882ecf9f280b0385bef420cce83bd13346a8baa4
BLAKE2b-256 checksum
How to use checksums
44a298b23778ec2fbda226027acd8861349364dd44fec6732f7148a56a5ad2b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 23, 2025.

Transparency log

Security for unifai-sdk 0.3.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for unifai_sdk-0.3.3.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 23, 2025.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page