"""Utility functions used in our graph.""" from typing import Optional from langchain.chat_models import init_chat_model from langchain_core.language_models import BaseChatModel from langchain_core.messages import AnyMessage from langchain_core.runnables import RunnableConfig from researchgraph.configuration import Configuration def get_message_text(msg: AnyMessage) -> str: """Get the text content of a message.""" content = msg.content if isinstance(content, str): return content elif isinstance(content, dict): return content.get("text", "") else: txts = [c if isinstance(c, str) else (c.get("text") or "") for c in content] return "".join(txts).strip() def init_model(config: Optional[RunnableConfig] = None) -> BaseChatModel: """Initialize the configured chat model.""" configuration = Configuration.from_runnable_config(config) fully_specified_name = configuration.model if "/" in fully_specified_name: provider, model = fully_specified_name.split("/", maxsplit=1) else: provider = None model = fully_specified_name return init_chat_model(model, model_provider=provider)