From 80a5dab1a43016f87a7145e7dac576b68b9c56ba Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Fri, 10 May 2024 08:00:31 -0700 Subject: [PATCH] Remove dependency on langserve --- backend/app/api/runs.py | 21 ++++++++++++++++++++- backend/app/stream.py | 12 +++++++++--- backend/poetry.lock | 24 +----------------------- backend/pyproject.toml | 1 - 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/backend/app/api/runs.py b/backend/app/api/runs.py index 2d4a83da..eb70c93e 100644 --- a/backend/app/api/runs.py +++ b/backend/app/api/runs.py @@ -6,7 +6,6 @@ from langchain.pydantic_v1 import ValidationError from langchain_core.messages import AnyMessage from langchain_core.runnables import RunnableConfig -from langserve.schema import FeedbackCreateRequest from langsmith.utils import tracing_is_enabled from pydantic import BaseModel, Field from sse_starlette import EventSourceResponse @@ -102,6 +101,26 @@ async def config_schema() -> dict: if tracing_is_enabled(): langsmith_client = langsmith.client.Client() + class BaseFeedback(BaseModel): + """ + Shared information between create requests of feedback and feedback objects + """ + + run_id: UUID + """The associated run ID this feedback is logged for.""" + + key: str + """The metric name, tag, or aspect to provide feedback on.""" + + score: Optional[Union[float, int, bool]] = None + """Value or score to assign the run.""" + + value: Optional[Union[float, int, bool, str, Dict]] = None + """The display value for the feedback if not a metric.""" + + comment: Optional[str] = None + """Comment or explanation for the feedback.""" + @router.post("/feedback") def create_run_feedback(feedback_create_req: FeedbackCreateRequest) -> dict: """ diff --git a/backend/app/stream.py b/backend/app/stream.py index 2bfddb58..bcf72193 100644 --- a/backend/app/stream.py +++ b/backend/app/stream.py @@ -1,10 +1,10 @@ +import functools from typing import Any, AsyncIterator, Dict, Optional, Sequence, Union import orjson import structlog from langchain_core.messages import AnyMessage, BaseMessage, message_chunk_to_message from langchain_core.runnables import Runnable, RunnableConfig -from langserve.serialization import WellKnownLCSerializer logger = structlog.get_logger(__name__) @@ -54,7 +54,13 @@ async def astream_state( yield [messages[message.id]] -_serializer = WellKnownLCSerializer() +def _default(obj) -> Any: + if hasattr(obj, "dict") and callable(obj.dict): + return obj.dict() + raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable") + + +dumps = functools.partial(orjson.dumps, default=_default) async def to_sse(messages_stream: MessagesStream) -> AsyncIterator[dict]: @@ -72,7 +78,7 @@ async def to_sse(messages_stream: MessagesStream) -> AsyncIterator[dict]: else: yield { "event": "data", - "data": _serializer.dumps( + "data": dumps( [message_chunk_to_message(msg) for msg in chunk] ).decode(), } diff --git a/backend/poetry.lock b/backend/poetry.lock index 39d58458..ebf6d864 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -1891,28 +1891,6 @@ files = [ [package.dependencies] langchain-core = ">=0.1.42,<0.2.0" -[[package]] -name = "langserve" -version = "0.0.32" -description = "" -optional = false -python-versions = ">=3.8.1,<4.0.0" -files = [ - {file = "langserve-0.0.32-py3-none-any.whl", hash = "sha256:41cc522fcec22f1d4e2ec05bd8952783a297fbf57c65eb2ab5ad29dff03caa86"}, - {file = "langserve-0.0.32.tar.gz", hash = "sha256:8773fe87ec27c263756d4f2dcd2f0fc8a970ac90e475a517703821bd5ae1836d"}, -] - -[package.dependencies] -httpx = ">=0.23.0" -langchain = ">=0.0.333" -orjson = ">=2" -pydantic = ">=1" - -[package.extras] -all = ["fastapi (>=0.90.1,<1)", "httpx-sse (>=0.3.1)", "sse-starlette (>=1.3.0,<2.0.0)"] -client = ["httpx-sse (>=0.3.1)"] -server = ["fastapi (>=0.90.1,<1)", "sse-starlette (>=1.3.0,<2.0.0)"] - [[package]] name = "langsmith" version = "0.1.5" @@ -4245,4 +4223,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.9.0,<3.12" -content-hash = "b7d0f0b5e51111723047cfbc8122c71d33e6f15f71f8243d5734bd09c8ee12a1" +content-hash = "292cde0456ddc756bdf0ff44741c80e41f87edf36fce55b8899c634080bbab34" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index e1597bb8..c7ecf19b 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -12,7 +12,6 @@ sse-starlette = "^1.6.5" tomli-w = "^1.0.0" uvicorn = "^0.23.2" fastapi = "^0.103.2" -langserve = "0.0.32" # Uncomment if you need to work from a development branch # This will only work for local development though! # langchain = { git = "git@github.com:langchain-ai/langchain.git/", branch = "nc/subclass-runnable-binding" , subdirectory = "libs/langchain"}