Source code for steamship.agents.utils

from operator import attrgetter
from typing import List, Optional

from steamship import Block, MimeTypes
from steamship.agents.schema import AgentContext
from steamship.agents.schema.llm import LLM
from steamship.agents.schema.message_selectors import MessageSelector

_LLM_KEY = "llm"


[docs] def with_llm(llm: LLM, context: Optional[AgentContext] = None) -> AgentContext: """Sets an LLM for general purpose lookup and usage on an AgentContext.""" if context is None: # TODO: should we have a default context somehow? context = AgentContext() context.metadata[_LLM_KEY] = llm return context
[docs] def get_llm(context: AgentContext, default: Optional[LLM] = None) -> Optional[LLM]: """Retrieves the LLM from the provided AgentContext (if it exists).""" return context.metadata.get(_LLM_KEY, default)
[docs] def build_chat_history( default_system_message: str, message_selector: MessageSelector, context: AgentContext ) -> List[Block]: # system message should have already been created in context, but we double-check for safety if context.chat_history.last_system_message: sys_msg = context.chat_history.last_system_message else: sys_msg = context.chat_history.append_system_message( text=default_system_message, mime_type=MimeTypes.TXT ) messages: List[Block] = [sys_msg] messages_from_memory = [] # get prior conversations if context.chat_history.is_searchable(): messages_from_memory.extend( context.chat_history.search(context.chat_history.last_user_message.text, k=3) .wait() .to_ranked_blocks() ) # TODO(dougreid): we need a way to threshold message inclusion, especially for small contexts # get most recent context messages_from_memory.extend(context.chat_history.select_messages(message_selector)) messages_from_memory.sort(key=attrgetter("index_in_file")) # de-dupe the messages from memory ids = [ sys_msg.id, context.chat_history.last_user_message.id, ] # filter out last user message, it is appended afterwards for msg in messages_from_memory: if msg.id not in ids: messages.append(msg) ids.append(msg.id) # TODO(dougreid): sort by dates? we SHOULD ensure ordering, given semantic search # put the user prompt in the appropriate message location # this should happen BEFORE any agent/assistant messages related to tool selection messages.append(context.chat_history.last_user_message) return messages