mirror of
https://github.com/kennethreitz/simplemind.git
synced 2026-06-05 22:50:18 +00:00
examples dir
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Add the parent directory to the path so we can import the module.
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
||||
|
||||
|
||||
import simplemind as sm
|
||||
|
||||
__all__ = ["sm"]
|
||||
@@ -0,0 +1,99 @@
|
||||
from _context import sm
|
||||
|
||||
from pydantic import BaseModel
|
||||
import openai
|
||||
import faiss
|
||||
import numpy as np
|
||||
import os
|
||||
import pickle
|
||||
|
||||
|
||||
class ContextualMemoryPlugin:
|
||||
def __init__(self, api_key: str, memory_file: str = "memories.pkl", embedding_model: str = "text-embedding-ada-002"):
|
||||
openai.api_key = api_key
|
||||
self.memory_file = memory_file
|
||||
self.embedding_model = embedding_model
|
||||
self.memories = []
|
||||
self.embeddings = None
|
||||
self.index = None
|
||||
self.load_memories()
|
||||
|
||||
def load_memories(self):
|
||||
if os.path.exists(self.memory_file):
|
||||
with open(self.memory_file, "rb") as f:
|
||||
self.memories, self.embeddings = pickle.load(f)
|
||||
self.build_faiss_index()
|
||||
else:
|
||||
self.memories = []
|
||||
self.embeddings = []
|
||||
self.index = faiss.IndexFlatL2(1536) # Dimension for ada-002 embeddings
|
||||
|
||||
def save_memories(self):
|
||||
with open(self.memory_file, "wb") as f:
|
||||
pickle.dump((self.memories, self.embeddings), f)
|
||||
|
||||
def build_faiss_index(self):
|
||||
if self.embeddings:
|
||||
self.index = faiss.IndexFlatL2(len(self.embeddings[0]))
|
||||
self.index.add(np.array(self.embeddings).astype('float32'))
|
||||
else:
|
||||
self.index = faiss.IndexFlatL2(1536)
|
||||
|
||||
def get_embedding(self, text: str) -> list:
|
||||
response = openai.Embedding.create(input=text, model=self.embedding_model)
|
||||
return response['data'][0]['embedding']
|
||||
|
||||
def add_memory(self, memory: str):
|
||||
embedding = self.get_embedding(memory)
|
||||
self.memories.append(memory)
|
||||
self.embeddings.append(embedding)
|
||||
self.index.add(np.array([embedding]).astype('float32'))
|
||||
self.save_memories()
|
||||
|
||||
def retrieve_memories(self, query: str, top_k: int = 3) -> list:
|
||||
if not self.index or len(self.embeddings) == 0:
|
||||
return []
|
||||
query_embedding = self.get_embedding(query)
|
||||
D, I = self.index.search(np.array([query_embedding]).astype('float32'), top_k)
|
||||
return [self.memories[i] for i in I[0] if i < len(self.memories)]
|
||||
|
||||
def send_hook(self, conversation: sm.Conversation):
|
||||
# Retrieve relevant memories based on the latest user message
|
||||
if conversation.messages:
|
||||
last_user_message = conversation.messages[-1].text
|
||||
relevant_memories = self.retrieve_memories(last_user_message)
|
||||
for memory in relevant_memories:
|
||||
conversation.add_message(role="system", text=memory)
|
||||
|
||||
def on_response(self, conversation: sm.Conversation, response: str):
|
||||
# Optionally, add the AI's response to memories
|
||||
self.add_memory(response)
|
||||
|
||||
# Example Usage
|
||||
|
||||
# Define a Pydantic model if needed
|
||||
class Story(BaseModel):
|
||||
title: str
|
||||
content: str
|
||||
|
||||
# Initialize the conversation with the ContextualMemoryPlugin
|
||||
memory_plugin = ContextualMemoryPlugin(api_key=sm.settings.OPENAI_API_KEY)
|
||||
|
||||
conversation = sm.create_conversation(llm_model="gpt-4o-mini", llm_provider="openai")
|
||||
conversation.add_plugin(memory_plugin)
|
||||
|
||||
# Add user message
|
||||
conversation.add_message("user", "Tell me a story about a brave knight.")
|
||||
|
||||
# Send the conversation and get the response
|
||||
response = conversation.send()
|
||||
print(response.text)
|
||||
|
||||
# Optionally, retrieve structured data
|
||||
structured_response = sm.generate_data(
|
||||
"Summarize the above story.",
|
||||
llm_model="gpt-4o",
|
||||
llm_provider="openai",
|
||||
response_model=Story,
|
||||
)
|
||||
print(structured_response)
|
||||
@@ -0,0 +1,5 @@
|
||||
from _context import sm
|
||||
|
||||
r = sm.generate_text("Write a poem about the moon", llm_provider="openai", llm_model="gpt-3.5-turbo")
|
||||
|
||||
print(r)
|
||||
@@ -0,0 +1,4 @@
|
||||
numpy
|
||||
openai
|
||||
pydantic
|
||||
faiss-cpu
|
||||
@@ -0,0 +1,28 @@
|
||||
from _context import sm
|
||||
|
||||
|
||||
class SimpleMemoryPlugin:
|
||||
def __init__(self):
|
||||
self.memories = [
|
||||
"the earth has fictionally beeen destroyed.",
|
||||
"the moon is made of cheese.",
|
||||
]
|
||||
|
||||
def yield_memories(self):
|
||||
return (m for m in self.memories)
|
||||
|
||||
def send_hook(self, conversation: sm.Conversation):
|
||||
for m in self.yield_memories():
|
||||
conversation.add_message(role="system", text=m)
|
||||
|
||||
|
||||
conversation = sm.create_conversation(llm_model="grok-beta", llm_provider="xai")
|
||||
conversation.add_plugin(SimpleMemoryPlugin())
|
||||
|
||||
conversation.add_message(
|
||||
role="user",
|
||||
text="Write a poem about the moon",
|
||||
)
|
||||
|
||||
r = conversation.send()
|
||||
print(r.text)
|
||||
+8
-13
@@ -1,24 +1,17 @@
|
||||
from .models import Conversation
|
||||
from .utils import find_provider
|
||||
|
||||
|
||||
class SimpleMind:
|
||||
|
||||
def structured_response(
|
||||
self, prompt, *, llm_model=None, llm_provider=None, response_model=None
|
||||
):
|
||||
provider = find_provider(llm_provider)
|
||||
|
||||
return provider.structured_response(
|
||||
llm_model=llm_model, response_model=response_model, prompt=prompt
|
||||
)
|
||||
from .settings import settings
|
||||
|
||||
|
||||
def create_conversation(llm_model=None, llm_provider=None):
|
||||
"""Create a new conversation."""
|
||||
|
||||
return Conversation(llm_model=llm_model, llm_provider=llm_provider)
|
||||
|
||||
|
||||
def generate_data(prompt, *, llm_model=None, llm_provider=None, response_model=None):
|
||||
"""Generate structured data from a given prompt."""
|
||||
|
||||
provider = find_provider(llm_provider)
|
||||
|
||||
return provider.structured_response(
|
||||
@@ -29,6 +22,8 @@ def generate_data(prompt, *, llm_model=None, llm_provider=None, response_model=N
|
||||
|
||||
|
||||
def generate_text(prompt, *, llm_model=None, llm_provider=None):
|
||||
"""Generate text from a given prompt."""
|
||||
|
||||
provider = find_provider(llm_provider)
|
||||
|
||||
return provider.generate_text(prompt=prompt, llm_model=llm_model)
|
||||
@@ -36,9 +31,9 @@ def generate_text(prompt, *, llm_model=None, llm_provider=None):
|
||||
|
||||
__all__ = [
|
||||
"Conversation",
|
||||
"SimpleMind",
|
||||
"create_conversation",
|
||||
"find_provider",
|
||||
"generate_data",
|
||||
"generate_text",
|
||||
"settings"
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user