Skip to main content

Success-based pricing SDK for LLM-based applications

Project description

Mutable

A Python SDK for adding success-based pricing to LLM-based applications Don't hesitate to reach out to chase@mutability.ai with any questions, concerns, or if you need guidance (or if you just want to say hi!). If you're looking to integrate this with a production-grade application and want a more high touch integration, we'd love to meet you. Book some time with us here.

Website Badge Twitter URL

Mutable is a Python toolkit with packages designed to make adding success-based pricing to your LLM-based application ridiculously simple and intutuive. Success-based pricing is the inevitable next step in pricing for software that's speculative and produces work (rather than facilitates it). Intercom Fin and Sierra AI are leading the pack. You should join them.

  • Determine a consensus definition of success to better understand and serve user needs
  • Capture and measure success, provide users with insight into model performance
  • Programmatically tether consumption and usage fees to success threshold
  • Drive adoption to your application by aligning your incentives with your users'

Features

  • Instrumentation of OpenAI and Langchain to cover most implementations of LLMs
  • Integrates directly with Stripe and preexisting subscriptions
  • Robust evaluation of RAG functionality and outcome/scenario simulation
  • Integrate user scoring and qualitative feedback into success determination
  • Dashboard for monitoring and billing visibility

Quickstart

First, install the Mutable Python SDK via pip

pip install mutable-dev

Then, set relevant API keys (e.g., Stripe, OpenAI)

export OPENAI_API_KEY=YOUR_API_KEY_HERE
export STRIPE_API_KEY=YOUR_API_KEY_HERE
export MUTABLE_API_KEY=YOUR_API_KEY_HERE

Generate your Mutable API key from the API console and configure your preferences (e.g., numerical thresholds, evaluative metrics)

OpenAI example

Make the relevant imports, add runtime preferences (e.g., relevant Stripe subscription ID, phrase used to demarcate question from context in single-prompt applications), and then call evaluate_success_and_payment() wherever and whenever applicable.

from mutable.openai import openai, evaluate_success_and_payment, MutablePreferences 
import os 

''' Need your own business logic to extract the Stripe subscription ID corresponding to the user in the session
'''
MutablePreferences().configure({'stripe_subscription_id': 'sub_1OnWlNDTU9hgRfhMx4ozr8wm', 'question_demarcator': 'Question'})


'''
Example GPT-3.5 wrapper application
'''

ended = False 
while not ended:
    newQuery = input("Provide your query or type \"end\" to end the chat: ")
    if newQuery == "end":
        ended = True 
    else:
        prompt = f"Context: Lemonde stands in Palo Alto are few and far between. Question: {newQuery}"
        completion = openai.chat.completions.create(
        model="gpt-3.5-turbo", messages=[
               
                {"role": "user", "content": prompt}
            ]
        )

        print("Response: %s"%(completion.choices[0].message))
        '''
        Execute this function whenever relevant (e.g., after each Q&A volley or generation) to judge the outputs of your model and log a transaction
        '''
        evaluate_success_and_payment() 
        
        

Langchain quickstart

from langchain import hub 
from langchain.text_splitter import RecursiveCharacterTextSplitter 
from langchain_community.llms import OpenAI
from langchain_community.chat_models import ChatOpenAI 
from langchain_community.document_loaders import DirectoryLoader
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma 
from langchain.chains import RetrievalQA
from langchain.prompts import  PromptTemplate
from langchain.chains.combine_documents.base import BaseCombineDocumentsChain
from langchain.chains.qa_with_sources.retrieval import RetrievalQAWithSourcesChain
from mutable.callbacks import MutableHandler
from langfuse.callback import CallbackHandler 




# Example subscription ID, to be retrieved through own business logic
subscription_id = 'sub_1OnWlNDTU9hgRfhMx4ozr8wm'


# Setting up Langfuse for logging and more sophisicated observability
lfHandler = CallbackHandler()
# Initialize Mutable callback handler
mHandler = MutableHandler(langfuseHandler=lfHandler, stripe_subscription_id=subscription_id)



# Example chain
def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)
def createChain():
    currentDirectory = os.getcwd()
    print("Beginning document loader...")
    loader = DirectoryLoader(f'{currentDirectory}/exampleDocs/')
    docs = loader.load() 
    print("Loading documents...")
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    splits = text_splitter.split_documents(docs)
    print("Chunking...")
    vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
    print("Vector store created...")

    retriever = vectorstore.as_retriever(callbacks=[mutabilityHandler]) 
    print("Retriever created...")
    example_prompt_string = """
    Respond to the question using only the provided context.
    {context}
    {question}"""
    EXAMPLE_PROMPT = PromptTemplate(input_variables=['context', 'question'], template=example_prompt_string)
    llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106', temperature=0)
    chain_type_kwargs = {"prompt": EXAMPLE_PROMPT}
    print("Chain being instantiated...")
    rag_chain = RetrievalQA.from_chain_type(
        retriever=retriever,
        chain_type_kwargs=chain_type_kwargs,
        llm=llm,
        chain_type="stuff",
        verbose=True
    )
    return rag_chain

if __name__ == '__main__':
    ragChain = createChain() 
    result = ragChain("What are the obligations of All-American Homecare to supervisors as a fiscal intermediary? Please list them out and provide exposition for each duty.", callbacks=[lfHandler, mHandler])
    print(result)
    print(mHandler.get_and_score_trace())

    
    #print(mHandler.get_stored_scores())

Roadmap

  • 🚧 More robust event and transaction tracking with performance breakdowns and prompt guidance
  • 🚧 Instrumentation for other LLM frameworks (e.g., LiteLLM)
  • 🚧 Integration with other payment platforms
  • 🚧 Modularity in evaluation (e.g., substitute with your own evaluation framework)
  • 🚧 Pricing page creator

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

mutable-dev-0.1.7.7.tar.gz (16.9 kB view details)

Uploaded Source

Built Distribution

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

mutable_dev-0.1.7.7-py3-none-any.whl (17.4 kB view details)

Uploaded Python 3

File details

Details for the file mutable-dev-0.1.7.7.tar.gz.

File metadata

  • Download URL: mutable-dev-0.1.7.7.tar.gz
  • Upload date:
  • Size: 16.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.6

File hashes

Hashes for mutable-dev-0.1.7.7.tar.gz
Algorithm Hash digest
SHA256 2f610a56983b9d377eeb353dfd59f1cc8c0c403ad979020f8fa8949d1312d6dc
MD5 43fc655b2dff1ecc5ccb7c8e1b77db02
BLAKE2b-256 f54194995665203f3c1164d725e4e0f419a1a6d7fdaa72cce8be8c44f30cac80

See more details on using hashes here.

File details

Details for the file mutable_dev-0.1.7.7-py3-none-any.whl.

File metadata

  • Download URL: mutable_dev-0.1.7.7-py3-none-any.whl
  • Upload date:
  • Size: 17.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.6

File hashes

Hashes for mutable_dev-0.1.7.7-py3-none-any.whl
Algorithm Hash digest
SHA256 c58a842d4e6456010322d2325d1004b31c7c6edc60f2d40fa0150396cdfec7b7
MD5 c0c28dd96990d4c482b01afd4d24e44a
BLAKE2b-256 475a89715d55de21cd14397f85e6ae1916030a22d76a52db4c08ac7d9fa9930d

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