Skip to main content

A minimal, async-native, and unopinionated toolkit for modern LLM applications.

Project description

lingo library logo

A minimal, async-native, and unopinionated toolkit for modern LLM applications.


PyPI - Version PyPi - Python Version Github - Open Issues PyPi - Downloads (Monthly) Github - Commits

Lingo is a framework for creating LLM-based applications built on the concept of Prompt Flows. It offers two distinct patterns for building AI logic: the Flow API (declarative) and the Bot API (imperative). You can mix and match these approaches as needed, using flows for reusable logic and the Bot API for stateful, interactive agents.

1. The Flow API (Declarative)

The Flow API is designed for building reusable, stateless sequences of operations. Using a fluent interface, you chain nodes that represent logical steps. Because these flows use Python 3.12 generics (Flow[T]), the return type is tracked throughout the entire chain.

Example: A Research & Extraction Flow

This flow performs parallel research, handles potential errors atomically, and extracts structured data.

from lingo import Flow, Engine, LLM
from pydantic import BaseModel

class ResearchData(BaseModel):
    summary: str
    confidence: float

# Define a 'fixer' for retries
fixer = Flow().append(lambda ctx: f"Error encountered: {ctx.metadata['last_exception']}")

# Declarative Flow
research_flow = (Flow[ResearchData]("Researcher")
    .append("Topic: {topic}")
    .fork(
        Flow().append("Search news...").act(news_tool),
        Flow().append("Search wiki...").act(wiki_tool),
        aggregator="Synthesize these findings"
    )
    .retry(fixer, max_retries=2)
    .create(ResearchData, "Generate the final JSON object")
)

2. The Bot API (Imperative)

The Bot API allows you to build stateful agents by inheriting from the Lingo class. Here, you manually interact with the Engine and Context. The primary building block is the Skill, which acts as a top-level router. The bot automatically selects the most appropriate skill based on the user's input.

Example: The Banker Bot

This bot uses skills to handle different intents and includes manual Tool Calling.

from lingo import Lingo, Context, Engine, Message, skill, tool

bot = Lingo(name="Banker", description="A bank assistant")

@bot.skill
async def banker_skill(context: Context, engine: Engine):
    """Interact with the bank account."""
    # Manual tool selection and invocation
    selected_tool = await engine.equip(context) # Inspects available @bot.tools
    result = await engine.invoke(context, selected_tool)

    # Imperative response generation
    await engine.reply(
        context,
        Message.system(result),
        Message.system("Inform the user of the result.")
    )

@bot.tool
async def check_balance() -> dict:
    """Returns the current account balance."""
    return {"balance": 1000}

# You can also call a declarative Flow from within a Skill
@bot.skill
async def specialized_task(context: Context, engine: Engine):
    """Runs a pre-defined declarative flow."""
    result = await my_declarative_flow.run(engine, context)
    context.append(Message.assistant(f"Task complete: {result}"))

3. Key Differences at a Glance

Feature Flow API (Declarative) Bot API (Imperative)
Logic Type Reusable, stateless sequences. Stateful, dynamic agents.
Control Orchestrated via Node components. Direct access to Engine and Context.
Branching Handled by When and Branch nodes. Handled by the Skill Router.
Tool Use Managed via the act() node. Manual equip() and invoke() calls.
Error Handling Transactional retry() and attempt(). Manual try/except or context.atomic().

4. Resilience & Memory Management

Both APIs benefit from Lingo's v1.0 core primitives:

  • Atomic Transactions: Use context.atomic() to roll back history if a segment of logic fails, ensuring a clean history.
  • Context Compression: Use compress() to prune the message history (summarizing or sliding window) to stay within token limits.
  • Usage Auditing: Every interaction tracks token counts via Usage objects and optional on_message callbacks for the LLM.

5. Contribution & License

Contribution

Contributions are welcome! Please see CONTRIBUTING.md for guidelines on submitting PRs or reporting issues.

License

Lingo is released under the MIT License.

Would you like me to generate a more complex example where a Bot API agent manages multiple Flow API routines?

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

lingo_ai-1.0rc3.tar.gz (63.1 kB view details)

Uploaded Source

Built Distribution

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

lingo_ai-1.0rc3-py3-none-any.whl (24.1 kB view details)

Uploaded Python 3

File details

Details for the file lingo_ai-1.0rc3.tar.gz.

File metadata

  • Download URL: lingo_ai-1.0rc3.tar.gz
  • Upload date:
  • Size: 63.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.24 {"installer":{"name":"uv","version":"0.9.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for lingo_ai-1.0rc3.tar.gz
Algorithm Hash digest
SHA256 42f50cc2ec87fb9df1733d1b5a63e01f8c843ab381de8bb90c30e8a22186e845
MD5 adee998c33b2867d1f725e5c50a96e48
BLAKE2b-256 24c6139fa898e3ec826c03004023752cdd2f13bc8f4d5e4e9d47080c201f33c1

See more details on using hashes here.

File details

Details for the file lingo_ai-1.0rc3-py3-none-any.whl.

File metadata

  • Download URL: lingo_ai-1.0rc3-py3-none-any.whl
  • Upload date:
  • Size: 24.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.24 {"installer":{"name":"uv","version":"0.9.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for lingo_ai-1.0rc3-py3-none-any.whl
Algorithm Hash digest
SHA256 f2f4c8e1532632691999cc0aa58c8df624fd629affd2dc71322e43fa2685b68c
MD5 69f8d5569d2373ade05cd5b642ecede2
BLAKE2b-256 ae35c834dc6dcc9411561f090cce8ca9aff534966d2eb48c686be7a4b166806c

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