Skip to main content

Superfast logprob-native agent runtime

Project description

swiftagents

Superfast, logprob-native, async-first agent runtime.

Why swiftagents

  • Logprob-native routing and uncertainty
  • Tool-agnostic, model-agnostic (strict about logprobs)
  • Async-first with bounded speculation (max 2 tools)
  • Cost-aware, cacheable, and observable
  • Optional judge pipeline

Install

pip install swiftagents

Local development:

pip install -e .[dev]

Quickstart

import asyncio

from swiftagents.core import AgentRuntime, AgentConfig, MockModelClient, ToolRegistry, ToolSpec


def web_search(query: str) -> dict:
    # Put any code here: Pinecone, DB, APIs, etc.
    return {"snippet": "Example result"}


async def main():
    client = MockModelClient()
    client.queue_text("TOOL=WEB")
    client.queue_text("Answer using web evidence")

    spec = ToolSpec(
        name="WEB",
        description="Search the web",
        input_schema={"type": "object", "properties": {"query": {"type": "string"}}, "required": ["query"]},
        example_calls=[],
        cost_hint="medium",
        latency_hint_ms=200,
        side_effects=False,
        cacheable=True,
        cancellable=True,
    )

    tools = ToolRegistry()
    tools.register_function(web_search, spec)

    runtime = AgentRuntime(client=client, tools=tools, config=AgentConfig())
    result = await runtime.run("Find the latest overview")
    print(result.answer)


asyncio.run(main())

Core concepts

Model clients (logprobs required)

swiftagents requires token-level logprobs for routing. If a backend cannot provide them, it hard-errors.

Supported clients:

  • OpenAIChatCompletionsClient
  • VLLMOpenAICompatibleClient
  • MockModelClient (tests and examples)

Tools

Tools are async callables with a ToolSpec and return ToolResult.

from swiftagents.core import ToolSpec, ToolResult

class MyTool:
    def __init__(self):
        self.spec = ToolSpec(
            name="RAG",
            description="Retrieve from docs",
            input_schema={"type": "object", "properties": {"query": {"type": "string"}}, "required": ["query"]},
            example_calls=[],
            cost_hint="medium",
            latency_hint_ms=200,
            side_effects=False,
            cacheable=True,
            cancellable=True,
        )

    async def __call__(self, **kwargs):
        return ToolResult(ok=True, data={"docs": []}, error=None, metadata={})

Register functions directly (no tool classes)

Use any code inside a function (sync or async) and register it with a ToolSpec.

from swiftagents.core import ToolRegistry, ToolSpec, ToolResult

def pinecone_search(query: str) -> dict:
    # Put any code here (Pinecone, DB, API, etc.)
    # return raw data or ToolResult
    return {"matches": [{"id": "doc1", "score": 0.92}]}

spec = ToolSpec(
    name="PINECONE",
    description="Vector search over Pinecone",
    input_schema={"type": "object", "properties": {"query": {"type": "string"}}, "required": ["query"]},
    example_calls=[],
    cost_hint="medium",
    latency_hint_ms=200,
    side_effects=False,
    cacheable=True,
    cancellable=True,
)

registry = ToolRegistry()
registry.register_function(pinecone_search, spec)

If you prefer decorators:

from swiftagents.core import ToolRegistry, ToolSpec, tool

spec = ToolSpec(
    name="PINECONE",
    description="Vector search over Pinecone",
    input_schema={"type": "object", "properties": {"query": {"type": "string"}}, "required": ["query"]},
    example_calls=[],
    cost_hint="medium",
    latency_hint_ms=200,
    side_effects=False,
    cacheable=True,
    cancellable=True,
)

@tool(spec)
async def pinecone_tool(query: str):
    return {"matches": [{"id": "doc1", "score": 0.92}]}

registry = ToolRegistry()
registry.register(pinecone_tool)

Routing (logprob-gated)

Routing prompts the same LLM to output TOOL=<LABEL> where LABEL is NONE or a shortlist tool name. Confidence is computed using logprobs, entropy, and margin. Low confidence triggers bounded speculation.

Multi-tool routing modes

AgentConfig.multi_tool_mode controls how the runtime selects multiple tools:

  • single: default single-label routing (bounded speculation when uncertain).
  • multi_label: pick multiple tools from one router call using logprob thresholds.
  • multi_intent: lightweight heuristic splitting, then route each segment.
  • decompose: logprob-gated split decision + LLM decomposition into sub-questions, then route each.

All multi-tool modes merge tool evidence and produce one final answer.

Judge

Judge behaves like a tool. It can be disabled, run a cheap LLM, and optionally escalate to a stronger LLM. It can also run deterministic stage0 checks.

Caching and observability

  • Tool and model decision caches with TTL
  • Structured trace events
  • Token usage metrics and wasted work ratio

Examples

python -m swiftagents.examples.tool_selection
python -m swiftagents.examples.speculative_execution_demo
python -m swiftagents.examples.function_tool_demo

Benchmarks

python -m swiftagents.benchmarks.run_benchmark

Tests

pytest

Design notes

  • The router is logprob-native; labels should be compact and stable (prefer short uppercase names).
  • Speculation is bounded to two tools and never speculative for side-effecting tools unless explicitly allowed.
  • All runtime stages are async-first.

Project details


Download files

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

Source Distribution

swiftagents-0.1.3.tar.gz (27.6 kB view details)

Uploaded Source

Built Distribution

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

swiftagents-0.1.3-py3-none-any.whl (33.0 kB view details)

Uploaded Python 3

File details

Details for the file swiftagents-0.1.3.tar.gz.

File metadata

  • Download URL: swiftagents-0.1.3.tar.gz
  • Upload date:
  • Size: 27.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for swiftagents-0.1.3.tar.gz
Algorithm Hash digest
SHA256 13c7b94109d2a3fe389905021343cd95b08e795bf49bd7f6e30cb62cf0c52f18
MD5 16bc2348a130646856dd995d0c5d1bdc
BLAKE2b-256 47f9553e89f105563eb2c96d265234481d13eca320955b8e43fbaf85f6ef0406

See more details on using hashes here.

File details

Details for the file swiftagents-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: swiftagents-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 33.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for swiftagents-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 cfbfd873d95f84e406c9da734291414d99361d4975ab2b9bebcec33a2f80feeb
MD5 d4ddf54ce92203b151a178d44c099b31
BLAKE2b-256 0284b4fad30551cf9ccd7e44429cb31d342f7a4a03129808720c1a9297743fac

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