merge dev into two_edges

This commit is contained in:
cristhianzl 2024-06-17 10:01:28 -03:00
commit fcf4512210
133 changed files with 2534 additions and 1507 deletions

View file

@ -184,7 +184,7 @@ async def build_vertex(
result_data_response = ResultDataResponse.model_validate(result_dict, from_attributes=True)
except Exception as exc:
logger.exception(f"Error building vertex: {exc}")
logger.exception(f"Error building Component: {exc}")
params = format_exception_message(exc)
valid = False
output_label = vertex.outputs[0]["name"] if vertex.outputs else "output"
@ -241,7 +241,7 @@ async def build_vertex(
)
return build_response
except Exception as exc:
logger.error(f"Error building vertex: {exc}")
logger.error(f"Error building Component: {exc}")
logger.exception(exc)
message = parse_exception(exc)
raise HTTPException(status_code=500, detail=message) from exc
@ -336,7 +336,7 @@ async def build_vertex_stream(
raise ValueError(f"No result found for vertex {vertex_id}")
except Exception as exc:
logger.exception(f"Error building vertex: {exc}")
logger.exception(f"Error building Component: {exc}")
exc_message = parse_exception(exc)
if exc_message == "The message must be an iterator or an async iterator.":
exc_message = "This stream has already been closed."
@ -347,4 +347,4 @@ async def build_vertex_stream(
return StreamingResponse(stream_vertex(), media_type="text/event-stream")
except Exception as exc:
raise HTTPException(status_code=500, detail="Error building vertex") from exc
raise HTTPException(status_code=500, detail="Error building Component") from exc

View file

@ -5,9 +5,6 @@ from uuid import UUID
import sqlalchemy as sa
from fastapi import APIRouter, BackgroundTasks, Body, Depends, HTTPException, Request, UploadFile, status
from loguru import logger
from sqlmodel import Session, select
from langflow.api.utils import update_frontend_node_with_template_values
from langflow.api.v1.schemas import (
ConfigResponse,
@ -41,6 +38,8 @@ from langflow.services.deps import (
)
from langflow.services.session.service import SessionService
from langflow.services.task.service import TaskService
from loguru import logger
from sqlmodel import Session, select
if TYPE_CHECKING:
from langflow.services.cache.base import CacheService
@ -71,29 +70,20 @@ async def get_all(
async def simple_run_flow(
db: Session,
flow: Flow,
input_request: SimplifiedAPIRequest,
session_service: SessionService,
stream: bool = False,
api_key_user: Optional[User] = None,
):
try:
task_result: List[RunOutputs] = []
artifacts = {}
user_id = api_key_user.id if api_key_user else None
flow_id_str = str(flow.id)
if input_request.session_id:
session_data = await session_service.load_session(input_request.session_id, flow_id=flow_id_str)
graph, artifacts = session_data if session_data else (None, None)
if graph is None:
raise ValueError(f"Session {input_request.session_id} not found")
else:
if flow.data is None:
raise ValueError(f"Flow {flow_id_str} has no data")
graph_data = flow.data
graph_data = process_tweaks(graph_data, input_request.tweaks or {}, stream=stream)
graph = Graph.from_payload(graph_data, flow_id=flow_id_str, user_id=str(user_id))
if flow.data is None:
raise ValueError(f"Flow {flow_id_str} has no data")
graph_data = flow.data.copy()
graph_data = process_tweaks(graph_data, input_request.tweaks or {}, stream=stream)
graph = Graph.from_payload(graph_data, flow_id=flow_id_str, user_id=str(user_id))
inputs = [
InputValueRequest(components=[], input_value=input_request.input_value, type=input_request.input_type)
]
@ -115,8 +105,6 @@ async def simple_run_flow(
session_id=input_request.session_id,
inputs=inputs,
outputs=outputs,
artifacts=artifacts,
session_service=session_service,
stream=stream,
)
@ -189,10 +177,8 @@ async def simplified_run_flow(
"""
try:
return await simple_run_flow(
db=db,
flow=flow,
input_request=input_request,
session_service=session_service,
stream=stream,
api_key_user=api_key_user,
)
@ -263,7 +249,6 @@ async def webhook_run_flow(
db=db,
flow=flow,
input_request=input_request,
session_service=session_service,
)
return {"message": "Task started in the background", "status": "in progress"}
except Exception as exc:
@ -542,3 +527,4 @@ def get_config():
except Exception as exc:
logger.exception(exc)
raise HTTPException(status_code=500, detail=str(exc)) from exc
raise HTTPException(status_code=500, detail=str(exc)) from exc

View file

@ -1,5 +1,7 @@
from typing import List
from loguru import logger
from langflow.graph.schema import ResultData, RunOutputs
from langflow.schema import Data
@ -37,9 +39,32 @@ def build_data_from_result_data(result_data: ResultData, get_final_results_only:
"""
messages = result_data.messages
if not messages:
return []
data = []
# Handle results without chat messages (calling flow)
if not messages:
# Result with a single record
if isinstance(result_data.artifacts, dict):
data.append(Data(data=result_data.artifacts))
# List of artifacts
elif isinstance(result_data.artifacts, list):
for artifact in result_data.artifacts:
# If multiple records are found as artifacts, return as-is
if isinstance(artifact, Data):
data.append(artifact)
else:
# Warn about unknown output type
logger.warning(f"Unable to build record output from unknown ResultData.artifact: {str(artifact)}")
# Chat or text output
elif result_data.results:
data.append(Data(data={"result": result_data.results}, text_key="result"))
return data
else:
return []
for message in messages:
message_dict = message if isinstance(message, dict) else message.model_dump()
if get_final_results_only:

View file

@ -89,6 +89,7 @@ class AstraDBMessageWriterComponent(BaseMemoryComponent):
sender_name=sender_name,
metadata=metadata,
session_id=session_id,
type=sender,
)
]

View file

@ -164,4 +164,3 @@ class AstraDBVectorStoreComponent(CustomComponent):
)
return vector_store
return vector_store

View file

@ -21,6 +21,7 @@ from langflow.type_extraction.type_extraction import (
extract_union_types_from_generic_alias,
)
from langflow.utils import validate
from pydantic import BaseModel
if TYPE_CHECKING:
from langflow.graph.graph.base import Graph

View file

@ -5,8 +5,6 @@ from functools import partial
from itertools import chain
from typing import TYPE_CHECKING, Callable, Coroutine, Dict, Generator, List, Optional, Tuple, Type, Union
from loguru import logger
from langflow.graph.edge.base import ContractEdge
from langflow.graph.graph.constants import lazy_load_vertex_dict
from langflow.graph.graph.runnable_vertices_manager import RunnableVerticesManager
@ -21,6 +19,7 @@ from langflow.services.cache.utils import CacheMiss
from langflow.services.chat.service import ChatService
from langflow.services.deps import get_chat_service
from langflow.services.monitor.utils import log_transaction
from loguru import logger
if TYPE_CHECKING:
from langflow.graph.schema import ResultData
@ -729,6 +728,7 @@ class Graph:
files: Optional[list[str]] = None,
user_id: Optional[str] = None,
fallback_to_env_vars: bool = False,
cache: bool = True,
):
"""
Builds a vertex in the graph.
@ -784,19 +784,23 @@ class Graph:
raise ValueError(f"No result found for vertex {vertex_id}")
set_cache_coro = partial(chat_service.set_cache, key=self.flow_id)
next_runnable_vertices, top_level_vertices = await self.get_next_and_top_level_vertices(
lock, set_cache_coro, vertex
lock, set_cache_coro, vertex, cache=cache
)
flow_id = self.flow_id
log_transaction(flow_id, vertex, status="success")
return next_runnable_vertices, top_level_vertices, result_dict, params, valid, artifacts, vertex
except Exception as exc:
logger.exception(f"Error building vertex: {exc}")
logger.exception(f"Error building Component: {exc}")
flow_id = self.flow_id
log_transaction(flow_id, vertex, status="failure", error=str(exc))
raise exc
async def get_next_and_top_level_vertices(
self, lock: asyncio.Lock, set_cache_coro: Callable[["Graph", asyncio.Lock], Coroutine], vertex: Vertex
self,
lock: asyncio.Lock,
set_cache_coro: Callable[["Graph", asyncio.Lock], Coroutine],
vertex: Vertex,
cache: bool = True,
):
"""
Retrieves the next runnable vertices and the top level vertices for a given vertex.
@ -809,7 +813,9 @@ class Graph:
Returns:
Tuple[List[Vertex], List[Vertex]]: A tuple containing the next runnable vertices and the top level vertices.
"""
next_runnable_vertices = await self.run_manager.get_next_runnable_vertices(lock, set_cache_coro, self, vertex)
next_runnable_vertices = await self.run_manager.get_next_runnable_vertices(
lock, set_cache_coro, self, vertex, cache=cache
)
top_level_vertices = self.run_manager.get_top_level_vertices(self, next_runnable_vertices)
return next_runnable_vertices, top_level_vertices
@ -850,13 +856,13 @@ class Graph:
chat_service = get_chat_service()
run_id = uuid.uuid4()
self.set_run_id(run_id)
lock = chat_service._cache_locks[self.run_id]
while to_process:
current_batch = list(to_process) # Copy current deque items to a list
to_process.clear() # Clear the deque for new items
tasks = []
for vertex_id in current_batch:
vertex = self.get_vertex(vertex_id)
lock = chat_service._cache_locks[self.run_id]
task = asyncio.create_task(
self.build_vertex(
lock=lock,
@ -865,6 +871,7 @@ class Graph:
user_id=self.user_id,
inputs_dict={},
fallback_to_env_vars=fallback_to_env_vars,
cache=False,
),
name=f"{vertex.display_name} Run {vertex_task_run_count.get(vertex_id, 0)}",
)
@ -872,8 +879,15 @@ class Graph:
vertex_task_run_count[vertex_id] = vertex_task_run_count.get(vertex_id, 0) + 1
logger.debug(f"Running layer {layer_index} with {len(tasks)} tasks")
next_runnable_vertices = await self._execute_tasks(tasks)
try:
next_runnable_vertices = await self._execute_tasks(tasks)
except Exception as e:
logger.error(f"Error executing tasks in layer {layer_index}: {e}")
break
if not next_runnable_vertices:
break
to_process.extend(next_runnable_vertices)
layer_index += 1
logger.debug("Graph processing complete")
return self
@ -881,25 +895,23 @@ class Graph:
async def _execute_tasks(self, tasks: List[asyncio.Task]) -> List[str]:
"""Executes tasks in parallel, handling exceptions for each task."""
results = []
for i, task in enumerate(asyncio.as_completed(tasks)):
try:
result = await task
if isinstance(result, tuple) and len(result) == 7:
# Get the next runnable vertices
next_runnable_vertices = result[0]
results.extend(next_runnable_vertices)
else:
raise ValueError(f"Invalid result: {result}")
except Exception as e:
# Log the exception along with the task name for easier debugging
# task_name = task.get_name()
# coroutine has not attribute get_name
task_name = tasks[i].get_name()
logger.error(f"Task {task_name} failed with exception: {e}")
completed_tasks = await asyncio.gather(*tasks, return_exceptions=True)
for i, result in enumerate(completed_tasks):
task_name = tasks[i].get_name()
if isinstance(result, Exception):
logger.error(f"Task {task_name} failed with exception: {result}")
# Cancel all remaining tasks
for t in tasks[i:]:
for t in tasks[i + 1 :]:
t.cancel()
raise e
raise result
elif isinstance(result, tuple) and len(result) == 7:
# Get the next runnable vertices
next_runnable_vertices = result[0]
results.extend(next_runnable_vertices)
else:
raise ValueError(f"Invalid result from task {task_name}: {result}")
return results
def topological_sort(self) -> List[Vertex]:
@ -1377,3 +1389,5 @@ class Graph:
predecessor_map[edge.target_id].append(edge.source_id)
successor_map[edge.source_id].append(edge.target_id)
return predecessor_map, successor_map
return predecessor_map, successor_map
return predecessor_map, successor_map

View file

@ -59,6 +59,7 @@ class RunnableVerticesManager:
set_cache_coro: Callable[["Graph", asyncio.Lock], Awaitable[None]],
graph: "Graph",
vertex: "Vertex",
cache: bool = True,
):
"""
Retrieves the next runnable vertices in the graph for a given vertex.
@ -86,7 +87,8 @@ class RunnableVerticesManager:
for v_id in set(next_runnable_vertices): # Use set to avoid duplicates
self.update_vertex_run_state(v_id, is_runnable=False)
self.remove_from_predecessors(v_id)
await set_cache_coro(data=graph, lock=lock) # type: ignore
if cache:
await set_cache_coro(data=graph, lock=lock) # type: ignore
return next_runnable_vertices
@staticmethod

View file

@ -73,6 +73,7 @@ INPUT_COMPONENTS = [
OUTPUT_COMPONENTS = [
InterfaceComponentTypes.ChatOutput,
InterfaceComponentTypes.TextOutput,
InterfaceComponentTypes.DataOutput,
]

View file

@ -8,12 +8,16 @@
"dataType": "OpenAIModel",
"id": "OpenAIModel-k39HS",
"name": "text_output",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-njtka",
"inputTypes": ["Text", "Message"],
"inputTypes": [
"Text"
],
"type": "str"
}
},
@ -24,7 +28,7 @@
"stroke": "#555"
},
"target": "ChatOutput-njtka",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-njtkaœ, œinputTypesœ: [œTextœ, œMessageœ], œtypeœ: œstrœ}"
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-njtkaœ, œinputTypesœ: [œTextœ], œtypeœ: œstrœ}"
},
{
"className": "stroke-gray-900 stroke-connection",
@ -33,12 +37,18 @@
"dataType": "Prompt",
"id": "Prompt-uxBqP",
"name": "prompt",
"output_types": ["Prompt"]
"output_types": [
"Prompt"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "OpenAIModel-k39HS",
"inputTypes": ["Text", "Data", "Prompt"],
"inputTypes": [
"Text",
"Data",
"Prompt"
],
"type": "str"
}
},
@ -58,12 +68,19 @@
"dataType": "ChatInput",
"id": "ChatInput-P3fgL",
"name": "message",
"output_types": ["Message"]
"output_types": [
"Message"
]
},
"targetHandle": {
"fieldName": "user_input",
"id": "Prompt-uxBqP",
"inputTypes": ["Document", "Message", "Record", "Text"],
"inputTypes": [
"Document",
"Message",
"Record",
"Text"
],
"type": "str"
}
},
@ -84,10 +101,16 @@
"display_name": "Prompt",
"id": "Prompt-uxBqP",
"node": {
"base_classes": ["object", "str", "Text"],
"base_classes": [
"object",
"str",
"Text"
],
"beta": false,
"custom_fields": {
"template": ["user_input"]
"template": [
"user_input"
]
},
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
@ -110,7 +133,9 @@
"method": "build_prompt",
"name": "prompt",
"selected": "Prompt",
"types": ["Prompt"],
"types": [
"Prompt"
],
"value": "__UNDEFINED__"
},
{
@ -119,7 +144,9 @@
"method": "format_prompt",
"name": "text",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -150,7 +177,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -171,7 +200,12 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Document", "Message", "Record", "Text"],
"input_types": [
"Document",
"Message",
"Record",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -209,7 +243,11 @@
"display_name": "OpenAI",
"id": "OpenAIModel-k39HS",
"node": {
"base_classes": ["object", "Text", "str"],
"base_classes": [
"object",
"Text",
"str"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -247,7 +285,9 @@
"method": "text_response",
"name": "text_output",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
},
{
@ -256,7 +296,9 @@
"method": "build_model",
"name": "model_output",
"selected": "BaseLanguageModel",
"types": ["BaseLanguageModel"],
"types": [
"BaseLanguageModel"
],
"value": "__UNDEFINED__"
}
],
@ -278,7 +320,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, SecretStrInput, StrInput\nfrom langflow.inputs.inputs import IntInput\nfrom langflow.template import Output\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n )\n return output\n"
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, StrInput\nfrom langflow.template import Output\n\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n BoolInput(\n name=\"json_mode\",\n display_name=\"JSON Mode\",\n info=\"Enable JSON mode for the model output.\",\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n json_mode = self.json_mode\n seed = self.seed\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n response_format = None\n if json_mode:\n response_format = {\"type\": \"json_object\"}\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n response_format=response_format,\n seed=seed,\n )\n\n return output\n"
},
"input_value": {
"advanced": false,
@ -287,7 +329,11 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text", "Data", "Prompt"],
"input_types": [
"Text",
"Data",
"Prompt"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -307,7 +353,9 @@
"fileTypes": [],
"file_path": "",
"info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -327,7 +375,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -347,7 +397,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
@ -373,8 +425,10 @@
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": ["Text"],
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -394,7 +448,9 @@
"fileTypes": [],
"file_path": "",
"info": "The OpenAI API Key to use for the OpenAI model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": true,
"multiline": false,
@ -414,7 +470,9 @@
"fileTypes": [],
"file_path": "",
"info": "Stream the response from the model. Streaming works only in Chat.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -434,7 +492,9 @@
"fileTypes": [],
"file_path": "",
"info": "System message to pass to the model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -454,7 +514,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -490,7 +552,12 @@
"data": {
"id": "ChatOutput-njtka",
"node": {
"base_classes": ["Record", "Text", "str", "object"],
"base_classes": [
"Record",
"Text",
"str",
"object"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -515,7 +582,20 @@
"method": "message_response",
"name": "message",
"selected": "Message",
"types": ["Message"],
"types": [
"Message"
],
"value": "__UNDEFINED__"
},
{
"cache": true,
"display_name": "Text",
"method": "text_response",
"name": "text",
"selected": "Text",
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -537,7 +617,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import BoolInput, DropdownInput, MultilineInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n if isinstance(self.input_value, Message):\n message = self.input_value\n else:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n\n def text_response(self) -> Text:\n text = self.message_response().text\n return text\n"
},
"input_value": {
"advanced": false,
@ -546,7 +626,9 @@
"fileTypes": [],
"file_path": "",
"info": "Message to be passed as output.",
"input_types": ["Text", "Message"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -566,12 +648,17 @@
"fileTypes": [],
"file_path": "",
"info": "Type of sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User"],
"options": [
"Machine",
"User"
],
"password": false,
"placeholder": "",
"required": false,
@ -587,7 +674,9 @@
"fileTypes": [],
"file_path": "",
"info": "Name of the sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -607,7 +696,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID for the message.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -643,7 +734,12 @@
"data": {
"id": "ChatInput-P3fgL",
"node": {
"base_classes": ["object", "Record", "str", "Text"],
"base_classes": [
"object",
"Record",
"str",
"Text"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -667,7 +763,20 @@
"method": "message_response",
"name": "message",
"selected": "Message",
"types": ["Message"],
"types": [
"Message"
],
"value": "__UNDEFINED__"
},
{
"cache": true,
"display_name": "Text",
"method": "text_response",
"name": "text",
"selected": "Text",
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -689,7 +798,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatInput(ChatComponent):\n display_name = \"Chat Input\"\n description = \"Get chat inputs from the Playground.\"\n icon = \"ChatInput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n input_types=[],\n value=\"\",\n info=\"Message to be passed as input.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"User\",\n info=\"Type of sender.\",\n advanced=True,\n ),\n StrInput(\n name=\"sender_name\",\n type=str,\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=\"User\",\n advanced=True,\n ),\n StrInput(\n name=\"session_id\", type=str, display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, (Message, str)) and isinstance(message.text, str):\n self.store_message(message)\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\nfrom langflow.field_typing import Text\n\n\nclass ChatInput(ChatComponent):\n display_name = \"Chat Input\"\n description = \"Get chat inputs from the Playground.\"\n icon = \"ChatInput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n input_types=[],\n value=\"\",\n info=\"Message to be passed as input.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"User\",\n info=\"Type of sender.\",\n advanced=True,\n ),\n StrInput(\n name=\"sender_name\",\n type=str,\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=\"User\",\n advanced=True,\n ),\n StrInput(\n name=\"session_id\", type=str, display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n\n def text_response(self) -> Text:\n text = self.message_response().text\n return text\n"
},
"input_value": {
"advanced": false,
@ -718,12 +827,17 @@
"fileTypes": [],
"file_path": "",
"info": "Type of sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User"],
"options": [
"Machine",
"User"
],
"password": false,
"placeholder": "",
"required": false,
@ -739,7 +853,9 @@
"fileTypes": [],
"file_path": "",
"info": "Name of the sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -759,7 +875,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID for the message.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -803,4 +921,4 @@
"is_component": false,
"last_tested_version": "1.0.0a4",
"name": "Basic Prompting (Hello, World)"
}
}

View file

@ -13,7 +13,12 @@
"targetHandle": {
"fieldName": "reference_2",
"id": "Prompt-Rse03",
"inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"inputTypes": [
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str"
}
},
@ -34,12 +39,16 @@
"dataType": "OpenAIModel",
"id": "OpenAIModel-gi29P",
"name": "text_output",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-JPlxl",
"inputTypes": ["Text", "Message"],
"inputTypes": [
"Text"
],
"type": "str"
}
},
@ -50,7 +59,7 @@
"stroke": "#555"
},
"target": "ChatOutput-JPlxl",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-JPlxlœ, œinputTypesœ: [œTextœ, œMessageœ], œtypeœ: œstrœ}"
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-JPlxlœ, œinputTypesœ: [œTextœ], œtypeœ: œstrœ}"
},
{
"className": "stroke-gray-900 stroke-connection",
@ -64,7 +73,12 @@
"targetHandle": {
"fieldName": "reference_1",
"id": "Prompt-Rse03",
"inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"inputTypes": [
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str"
}
},
@ -84,12 +98,19 @@
"dataType": "TextInput",
"id": "TextInput-og8Or",
"name": "Text",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "instructions",
"id": "Prompt-Rse03",
"inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"inputTypes": [
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str"
}
},
@ -109,12 +130,18 @@
"dataType": "Prompt",
"id": "Prompt-Rse03",
"name": "prompt",
"output_types": ["Prompt"]
"output_types": [
"Prompt"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "OpenAIModel-gi29P",
"inputTypes": ["Text", "Data", "Prompt"],
"inputTypes": [
"Text",
"Data",
"Prompt"
],
"type": "str"
}
},
@ -136,10 +163,18 @@
"display_name": "Prompt",
"id": "Prompt-Rse03",
"node": {
"base_classes": ["object", "Text", "str"],
"base_classes": [
"object",
"Text",
"str"
],
"beta": false,
"custom_fields": {
"template": ["reference_1", "reference_2", "instructions"]
"template": [
"reference_1",
"reference_2",
"instructions"
]
},
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
@ -162,7 +197,9 @@
"method": "build_prompt",
"name": "prompt",
"selected": "Prompt",
"types": ["Prompt"],
"types": [
"Prompt"
],
"value": "__UNDEFINED__"
},
{
@ -171,7 +208,9 @@
"method": "format_prompt",
"name": "text",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -280,7 +319,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -316,7 +357,9 @@
"data": {
"id": "URL-HYPkR",
"node": {
"base_classes": ["Record"],
"base_classes": [
"Record"
],
"beta": false,
"custom_fields": {
"urls": null
@ -336,7 +379,9 @@
"method": "fetch_content",
"name": "data",
"selected": "Data",
"types": ["Data"],
"types": [
"Data"
],
"value": "__UNDEFINED__"
}
],
@ -358,7 +403,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langchain_community.document_loaders.web_base import WebBaseLoader\n\nfrom langflow.custom import Component\nfrom langflow.inputs import StrInput\nfrom langflow.schema import Data\nfrom langflow.template import Output\n\nimport re\n\n\nclass URLComponent(Component):\n display_name = \"URL\"\n description = \"Fetch content from one or more URLs.\"\n icon = \"layout-template\"\n\n inputs = [\n StrInput(\n name=\"urls\",\n display_name=\"URLs\",\n info=\"Enter one or more URLs, separated by commas.\",\n value=\"\",\n is_list=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"fetch_content\"),\n ]\n\n def ensure_url(self, string: str) -> str:\n \"\"\"\n Ensures the given string is a URL by adding 'http://' if it doesn't start with 'http://' or 'https://'.\n Raises an error if the string is not a valid URL.\n\n Parameters:\n string (str): The string to be checked and possibly modified.\n\n Returns:\n str: The modified string that is ensured to be a URL.\n\n Raises:\n ValueError: If the string is not a valid URL.\n \"\"\"\n if not string.startswith((\"http://\", \"https://\")):\n string = \"http://\" + string\n\n # Basic URL validation regex\n url_regex = re.compile(\n r\"^(http://|https://)?\" # http:// or https://\n r\"(([a-zA-Z0-9\\.-]+)\" # domain\n r\"(\\.[a-zA-Z]{2,}))\" # top-level domain\n r\"(:[0-9]{1,5})?\" # optional port\n r\"(\\/.*)?$\" # optional path\n )\n\n if not re.match(url_regex, string):\n raise ValueError(f\"Invalid URL: {string}\")\n\n return string\n\n def fetch_content(self) -> Data:\n urls = [self.ensure_url(url.strip()) for url in self.urls if url.strip()]\n loader = WebBaseLoader(web_paths=urls)\n docs = loader.load()\n data = [Data(content=doc.page_content, **doc.metadata) for doc in docs]\n self.status = data\n return data\n"
"value": "from langchain_community.document_loaders.web_base import WebBaseLoader\n\nfrom langflow.custom import Component\nfrom langflow.inputs import StrInput\nfrom langflow.schema import Data\nfrom langflow.template import Output\n\nimport re\n\n\nclass URLComponent(Component):\n display_name = \"URL\"\n description = \"Fetch content from one or more URLs.\"\n icon = \"layout-template\"\n\n inputs = [\n StrInput(\n name=\"urls\",\n display_name=\"URLs\",\n info=\"Enter one or more URLs, separated by commas.\",\n value=\"\",\n is_list=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"fetch_content\"),\n ]\n\n def ensure_url(self, string: str) -> str:\n \"\"\"\n Ensures the given string is a URL by adding 'http://' if it doesn't start with 'http://' or 'https://'.\n Raises an error if the string is not a valid URL.\n\n Parameters:\n string (str): The string to be checked and possibly modified.\n\n Returns:\n str: The modified string that is ensured to be a URL.\n\n Raises:\n ValueError: If the string is not a valid URL.\n \"\"\"\n if not string.startswith((\"http://\", \"https://\")):\n string = \"http://\" + string\n\n # Basic URL validation regex\n url_regex = re.compile(\n r\"^(http://|https://)?\" # http:// or https://\n r\"(([a-zA-Z0-9\\.-]+)\" # domain\n r\"(\\.[a-zA-Z]{2,}))\" # top-level domain\n r\"(:[0-9]{1,5})?\" # optional port\n r\"(\\/.*)?$\" # optional path\n )\n\n if not re.match(url_regex, string):\n raise ValueError(f\"Invalid URL: {string}\")\n\n return string\n\n def fetch_content(self) -> Data:\n urls = [self.ensure_url(url.strip()) for url in self.urls if url.strip()]\n loader = WebBaseLoader(web_paths=urls, encoding=\"utf-8\")\n docs = loader.load()\n data = [Data(content=doc.page_content, **doc.metadata) for doc in docs]\n self.status = data\n return data\n"
},
"urls": {
"advanced": false,
@ -398,7 +443,12 @@
"data": {
"id": "ChatOutput-JPlxl",
"node": {
"base_classes": ["Text", "Record", "object", "str"],
"base_classes": [
"Text",
"Record",
"object",
"str"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -423,7 +473,20 @@
"method": "message_response",
"name": "message",
"selected": "Message",
"types": ["Message"],
"types": [
"Message"
],
"value": "__UNDEFINED__"
},
{
"cache": true,
"display_name": "Text",
"method": "text_response",
"name": "text",
"selected": "Text",
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -445,7 +508,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import BoolInput, DropdownInput, MultilineInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n if isinstance(self.input_value, Message):\n message = self.input_value\n else:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n\n def text_response(self) -> Text:\n text = self.message_response().text\n return text\n"
},
"input_value": {
"advanced": false,
@ -454,7 +517,9 @@
"fileTypes": [],
"file_path": "",
"info": "Message to be passed as output.",
"input_types": ["Text", "Message"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -474,12 +539,17 @@
"fileTypes": [],
"file_path": "",
"info": "Type of sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User"],
"options": [
"Machine",
"User"
],
"password": false,
"placeholder": "",
"required": false,
@ -495,7 +565,9 @@
"fileTypes": [],
"file_path": "",
"info": "Name of the sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -515,7 +587,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID for the message.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -546,7 +620,11 @@
"data": {
"id": "OpenAIModel-gi29P",
"node": {
"base_classes": ["str", "Text", "object"],
"base_classes": [
"str",
"Text",
"object"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -584,7 +662,9 @@
"method": "text_response",
"name": "text_output",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
},
{
@ -593,7 +673,9 @@
"method": "build_model",
"name": "model_output",
"selected": "BaseLanguageModel",
"types": ["BaseLanguageModel"],
"types": [
"BaseLanguageModel"
],
"value": "__UNDEFINED__"
}
],
@ -615,7 +697,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, SecretStrInput, StrInput\nfrom langflow.inputs.inputs import IntInput\nfrom langflow.template import Output\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n )\n return output\n"
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, StrInput\nfrom langflow.template import Output\n\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n BoolInput(\n name=\"json_mode\",\n display_name=\"JSON Mode\",\n info=\"Enable JSON mode for the model output.\",\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n json_mode = self.json_mode\n seed = self.seed\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n response_format = None\n if json_mode:\n response_format = {\"type\": \"json_object\"}\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n response_format=response_format,\n seed=seed,\n )\n\n return output\n"
},
"input_value": {
"advanced": false,
@ -624,7 +706,11 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text", "Data", "Prompt"],
"input_types": [
"Text",
"Data",
"Prompt"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -644,7 +730,9 @@
"fileTypes": [],
"file_path": "",
"info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -664,7 +752,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -684,7 +774,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
@ -710,8 +802,10 @@
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": ["Text"],
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -731,7 +825,9 @@
"fileTypes": [],
"file_path": "",
"info": "The OpenAI API Key to use for the OpenAI model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": true,
"multiline": false,
@ -751,7 +847,9 @@
"fileTypes": [],
"file_path": "",
"info": "Stream the response from the model. Streaming works only in Chat.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -771,7 +869,9 @@
"fileTypes": [],
"file_path": "",
"info": "System message to pass to the model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -791,7 +891,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -827,7 +929,9 @@
"data": {
"id": "URL-2cX90",
"node": {
"base_classes": ["Record"],
"base_classes": [
"Record"
],
"beta": false,
"custom_fields": {
"urls": null
@ -847,7 +951,9 @@
"method": "fetch_content",
"name": "data",
"selected": "Data",
"types": ["Data"],
"types": [
"Data"
],
"value": "__UNDEFINED__"
}
],
@ -869,7 +975,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langchain_community.document_loaders.web_base import WebBaseLoader\n\nfrom langflow.custom import Component\nfrom langflow.inputs import StrInput\nfrom langflow.schema import Data\nfrom langflow.template import Output\n\nimport re\n\n\nclass URLComponent(Component):\n display_name = \"URL\"\n description = \"Fetch content from one or more URLs.\"\n icon = \"layout-template\"\n\n inputs = [\n StrInput(\n name=\"urls\",\n display_name=\"URLs\",\n info=\"Enter one or more URLs, separated by commas.\",\n value=\"\",\n is_list=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"fetch_content\"),\n ]\n\n def ensure_url(self, string: str) -> str:\n \"\"\"\n Ensures the given string is a URL by adding 'http://' if it doesn't start with 'http://' or 'https://'.\n Raises an error if the string is not a valid URL.\n\n Parameters:\n string (str): The string to be checked and possibly modified.\n\n Returns:\n str: The modified string that is ensured to be a URL.\n\n Raises:\n ValueError: If the string is not a valid URL.\n \"\"\"\n if not string.startswith((\"http://\", \"https://\")):\n string = \"http://\" + string\n\n # Basic URL validation regex\n url_regex = re.compile(\n r\"^(http://|https://)?\" # http:// or https://\n r\"(([a-zA-Z0-9\\.-]+)\" # domain\n r\"(\\.[a-zA-Z]{2,}))\" # top-level domain\n r\"(:[0-9]{1,5})?\" # optional port\n r\"(\\/.*)?$\" # optional path\n )\n\n if not re.match(url_regex, string):\n raise ValueError(f\"Invalid URL: {string}\")\n\n return string\n\n def fetch_content(self) -> Data:\n urls = [self.ensure_url(url.strip()) for url in self.urls if url.strip()]\n loader = WebBaseLoader(web_paths=urls)\n docs = loader.load()\n data = [Data(content=doc.page_content, **doc.metadata) for doc in docs]\n self.status = data\n return data\n"
"value": "from langchain_community.document_loaders.web_base import WebBaseLoader\n\nfrom langflow.custom import Component\nfrom langflow.inputs import StrInput\nfrom langflow.schema import Data\nfrom langflow.template import Output\n\nimport re\n\n\nclass URLComponent(Component):\n display_name = \"URL\"\n description = \"Fetch content from one or more URLs.\"\n icon = \"layout-template\"\n\n inputs = [\n StrInput(\n name=\"urls\",\n display_name=\"URLs\",\n info=\"Enter one or more URLs, separated by commas.\",\n value=\"\",\n is_list=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"fetch_content\"),\n ]\n\n def ensure_url(self, string: str) -> str:\n \"\"\"\n Ensures the given string is a URL by adding 'http://' if it doesn't start with 'http://' or 'https://'.\n Raises an error if the string is not a valid URL.\n\n Parameters:\n string (str): The string to be checked and possibly modified.\n\n Returns:\n str: The modified string that is ensured to be a URL.\n\n Raises:\n ValueError: If the string is not a valid URL.\n \"\"\"\n if not string.startswith((\"http://\", \"https://\")):\n string = \"http://\" + string\n\n # Basic URL validation regex\n url_regex = re.compile(\n r\"^(http://|https://)?\" # http:// or https://\n r\"(([a-zA-Z0-9\\.-]+)\" # domain\n r\"(\\.[a-zA-Z]{2,}))\" # top-level domain\n r\"(:[0-9]{1,5})?\" # optional port\n r\"(\\/.*)?$\" # optional path\n )\n\n if not re.match(url_regex, string):\n raise ValueError(f\"Invalid URL: {string}\")\n\n return string\n\n def fetch_content(self) -> Data:\n urls = [self.ensure_url(url.strip()) for url in self.urls if url.strip()]\n loader = WebBaseLoader(web_paths=urls, encoding=\"utf-8\")\n docs = loader.load()\n data = [Data(content=doc.page_content, **doc.metadata) for doc in docs]\n self.status = data\n return data\n"
},
"urls": {
"advanced": false,
@ -909,7 +1015,11 @@
"data": {
"id": "TextInput-og8Or",
"node": {
"base_classes": ["object", "Text", "str"],
"base_classes": [
"object",
"Text",
"str"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -922,12 +1032,16 @@
"field_order": [],
"frozen": false,
"icon": "type",
"output_types": ["Text"],
"output_types": [
"Text"
],
"outputs": [
{
"name": "Text",
"selected": "Text",
"types": ["Text"]
"types": [
"Text"
]
}
],
"template": {
@ -957,7 +1071,10 @@
"fileTypes": [],
"file_path": "",
"info": "Text or Record to be passed as input.",
"input_types": ["Record", "Text"],
"input_types": [
"Record",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -977,7 +1094,9 @@
"fileTypes": [],
"file_path": "",
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -1021,4 +1140,4 @@
"is_component": false,
"last_tested_version": "1.0.0a0",
"name": "Blog Writer"
}
}

View file

@ -7,12 +7,19 @@
"dataType": "File",
"id": "File-BzIs2",
"name": "data",
"output_types": ["Data"]
"output_types": [
"Data"
]
},
"targetHandle": {
"fieldName": "Document",
"id": "Prompt-9DNZG",
"inputTypes": ["Document", "Message", "Data", "Text"],
"inputTypes": [
"Document",
"Message",
"Data",
"Text"
],
"type": "str"
}
},
@ -28,12 +35,19 @@
"dataType": "ChatInput",
"id": "ChatInput-27Usy",
"name": "message",
"output_types": ["Message"]
"output_types": [
"Message"
]
},
"targetHandle": {
"fieldName": "Question",
"id": "Prompt-9DNZG",
"inputTypes": ["Document", "Message", "Data", "Text"],
"inputTypes": [
"Document",
"Message",
"Data",
"Text"
],
"type": "str"
}
},
@ -49,12 +63,18 @@
"dataType": "Prompt",
"id": "Prompt-9DNZG",
"name": "prompt",
"output_types": ["Prompt"]
"output_types": [
"Prompt"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "OpenAIModel-8b6nG",
"inputTypes": ["Text", "Data", "Prompt"],
"inputTypes": [
"Text",
"Data",
"Prompt"
],
"type": "str"
}
},
@ -70,12 +90,16 @@
"dataType": "OpenAIModel",
"id": "OpenAIModel-8b6nG",
"name": "text_output",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-y4SCS",
"inputTypes": ["Text", "Message"],
"inputTypes": [
"Text"
],
"type": "str"
}
},
@ -83,7 +107,7 @@
"source": "OpenAIModel-8b6nG",
"sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-8b6nGœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œTextœ]}",
"target": "ChatOutput-y4SCS",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-y4SCSœ, œinputTypesœ: [œTextœ, œMessageœ], œtypeœ: œstrœ}"
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-y4SCSœ, œinputTypesœ: [œTextœ], œtypeœ: œstrœ}"
}
],
"nodes": [
@ -93,11 +117,18 @@
"display_name": "Prompt",
"id": "Prompt-9DNZG",
"node": {
"base_classes": ["object", "str", "Text"],
"base_classes": [
"object",
"str",
"Text"
],
"beta": false,
"conditional_paths": [],
"custom_fields": {
"template": ["Document", "Question"]
"template": [
"Document",
"Question"
]
},
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
@ -119,7 +150,9 @@
"method": "build_prompt",
"name": "prompt",
"selected": "Prompt",
"types": ["Prompt"],
"types": [
"Prompt"
],
"value": "__UNDEFINED__"
},
{
@ -128,7 +161,9 @@
"method": "format_prompt",
"name": "text",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -142,7 +177,12 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Document", "Message", "Data", "Text"],
"input_types": [
"Document",
"Message",
"Data",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -163,7 +203,12 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Document", "Message", "Data", "Text"],
"input_types": [
"Document",
"Message",
"Data",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -202,7 +247,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -238,7 +285,12 @@
"data": {
"id": "ChatInput-27Usy",
"node": {
"base_classes": ["str", "Record", "Text", "object"],
"base_classes": [
"str",
"Record",
"Text",
"object"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -262,7 +314,20 @@
"method": "message_response",
"name": "message",
"selected": "Message",
"types": ["Message"],
"types": [
"Message"
],
"value": "__UNDEFINED__"
},
{
"cache": true,
"display_name": "Text",
"method": "text_response",
"name": "text",
"selected": "Text",
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -284,7 +349,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatInput(ChatComponent):\n display_name = \"Chat Input\"\n description = \"Get chat inputs from the Playground.\"\n icon = \"ChatInput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n input_types=[],\n value=\"\",\n info=\"Message to be passed as input.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"User\",\n info=\"Type of sender.\",\n advanced=True,\n ),\n StrInput(\n name=\"sender_name\",\n type=str,\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=\"User\",\n advanced=True,\n ),\n StrInput(\n name=\"session_id\", type=str, display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, (Message, str)) and isinstance(message.text, str):\n self.store_message(message)\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\nfrom langflow.field_typing import Text\n\n\nclass ChatInput(ChatComponent):\n display_name = \"Chat Input\"\n description = \"Get chat inputs from the Playground.\"\n icon = \"ChatInput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n input_types=[],\n value=\"\",\n info=\"Message to be passed as input.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"User\",\n info=\"Type of sender.\",\n advanced=True,\n ),\n StrInput(\n name=\"sender_name\",\n type=str,\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=\"User\",\n advanced=True,\n ),\n StrInput(\n name=\"session_id\", type=str, display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n\n def text_response(self) -> Text:\n text = self.message_response().text\n return text\n"
},
"input_value": {
"advanced": false,
@ -313,12 +378,17 @@
"fileTypes": [],
"file_path": "",
"info": "Type of sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User"],
"options": [
"Machine",
"User"
],
"password": false,
"placeholder": "",
"required": false,
@ -334,7 +404,9 @@
"fileTypes": [],
"file_path": "",
"info": "Name of the sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -354,7 +426,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID for the message.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -390,7 +464,12 @@
"data": {
"id": "ChatOutput-y4SCS",
"node": {
"base_classes": ["str", "Record", "Text", "object"],
"base_classes": [
"str",
"Record",
"Text",
"object"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -414,7 +493,20 @@
"method": "message_response",
"name": "message",
"selected": "Message",
"types": ["Message"],
"types": [
"Message"
],
"value": "__UNDEFINED__"
},
{
"cache": true,
"display_name": "Text",
"method": "text_response",
"name": "text",
"selected": "Text",
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -436,7 +528,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import BoolInput, DropdownInput, MultilineInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n if isinstance(self.input_value, Message):\n message = self.input_value\n else:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n\n def text_response(self) -> Text:\n text = self.message_response().text\n return text\n"
},
"input_value": {
"advanced": false,
@ -445,7 +537,9 @@
"fileTypes": [],
"file_path": "",
"info": "Message to be passed as output.",
"input_types": ["Text", "Message"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -465,12 +559,17 @@
"fileTypes": [],
"file_path": "",
"info": "Type of sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User"],
"options": [
"Machine",
"User"
],
"password": false,
"placeholder": "",
"required": false,
@ -486,7 +585,9 @@
"fileTypes": [],
"file_path": "",
"info": "Name of the sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -506,7 +607,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID for the message.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -544,7 +647,9 @@
"display_name": "File",
"id": "File-BzIs2",
"node": {
"base_classes": ["Data"],
"base_classes": [
"Data"
],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
@ -552,7 +657,10 @@
"display_name": "File",
"documentation": "",
"edited": true,
"field_order": ["path", "silent_errors"],
"field_order": [
"path",
"silent_errors"
],
"frozen": false,
"icon": "file-text",
"output_types": [],
@ -563,7 +671,9 @@
"method": "load_file",
"name": "data",
"selected": "Data",
"types": ["Data"],
"types": [
"Data"
],
"value": "__UNDEFINED__"
}
],
@ -660,7 +770,10 @@
"data": {
"id": "OpenAIModel-8b6nG",
"node": {
"base_classes": ["BaseLanguageModel", "Text"],
"base_classes": [
"BaseLanguageModel",
"Text"
],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
@ -688,7 +801,9 @@
"method": "text_response",
"name": "text_output",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
},
{
@ -697,7 +812,9 @@
"method": "build_model",
"name": "model_output",
"selected": "BaseLanguageModel",
"types": ["BaseLanguageModel"],
"types": [
"BaseLanguageModel"
],
"value": "__UNDEFINED__"
}
],
@ -720,14 +837,18 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, SecretStrInput, StrInput\nfrom langflow.inputs.inputs import IntInput\nfrom langflow.template import Output\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n )\n return output\n"
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, StrInput\nfrom langflow.template import Output\n\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n BoolInput(\n name=\"json_mode\",\n display_name=\"JSON Mode\",\n info=\"Enable JSON mode for the model output.\",\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n json_mode = self.json_mode\n seed = self.seed\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n response_format = None\n if json_mode:\n response_format = {\"type\": \"json_object\"}\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n response_format=response_format,\n seed=seed,\n )\n\n return output\n"
},
"input_value": {
"advanced": false,
"display_name": "Input",
"dynamic": false,
"info": "",
"input_types": ["Text", "Data", "Prompt"],
"input_types": [
"Text",
"Data",
"Prompt"
],
"list": false,
"load_from_db": false,
"name": "input_value",
@ -788,7 +909,7 @@
"advanced": true,
"display_name": "OpenAI API Base",
"dynamic": false,
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.",
"list": false,
"load_from_db": false,
"name": "openai_api_base",
@ -804,7 +925,9 @@
"display_name": "OpenAI API Key",
"dynamic": false,
"info": "The OpenAI API Key to use for the OpenAI model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"load_from_db": true,
"name": "openai_api_key",
"password": true,
@ -889,4 +1012,4 @@
"is_component": false,
"last_tested_version": "1.0.0a52",
"name": "Document QA"
}
}

View file

@ -8,12 +8,19 @@
"dataType": "MemoryComponent",
"id": "MemoryComponent-cdA1J",
"name": "text",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "context",
"id": "Prompt-ODkUx",
"inputTypes": ["Document", "Message", "Record", "Text"],
"inputTypes": [
"Document",
"Message",
"Record",
"Text"
],
"type": "str"
}
},
@ -34,12 +41,19 @@
"dataType": "ChatInput",
"id": "ChatInput-t7F8v",
"name": "message",
"output_types": ["Message"]
"output_types": [
"Message"
]
},
"targetHandle": {
"fieldName": "user_message",
"id": "Prompt-ODkUx",
"inputTypes": ["Document", "Message", "Record", "Text"],
"inputTypes": [
"Document",
"Message",
"Record",
"Text"
],
"type": "str"
}
},
@ -60,12 +74,18 @@
"dataType": "Prompt",
"id": "Prompt-ODkUx",
"name": "prompt",
"output_types": ["Prompt"]
"output_types": [
"Prompt"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "OpenAIModel-9RykF",
"inputTypes": ["Text", "Data", "Prompt"],
"inputTypes": [
"Text",
"Data",
"Prompt"
],
"type": "str"
}
},
@ -85,12 +105,16 @@
"dataType": "OpenAIModel",
"id": "OpenAIModel-9RykF",
"name": "text_output",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-P1jEe",
"inputTypes": ["Text", "Message"],
"inputTypes": [
"Text"
],
"type": "str"
}
},
@ -101,7 +125,7 @@
"stroke": "#555"
},
"target": "ChatOutput-P1jEe",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-P1jEeœ, œinputTypesœ: [œTextœ, œMessageœ], œtypeœ: œstrœ}"
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-P1jEeœ, œinputTypesœ: [œTextœ], œtypeœ: œstrœ}"
},
{
"className": "stroke-foreground stroke-connection",
@ -110,12 +134,17 @@
"dataType": "MemoryComponent",
"id": "MemoryComponent-cdA1J",
"name": "text",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "TextOutput-vrs6T",
"inputTypes": ["Record", "Text"],
"inputTypes": [
"Record",
"Text"
],
"type": "str"
}
},
@ -134,7 +163,12 @@
"data": {
"id": "ChatInput-t7F8v",
"node": {
"base_classes": ["Text", "object", "Record", "str"],
"base_classes": [
"Text",
"object",
"Record",
"str"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -158,7 +192,20 @@
"method": "message_response",
"name": "message",
"selected": "Message",
"types": ["Message"],
"types": [
"Message"
],
"value": "__UNDEFINED__"
},
{
"cache": true,
"display_name": "Text",
"method": "text_response",
"name": "text",
"selected": "Text",
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -180,7 +227,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatInput(ChatComponent):\n display_name = \"Chat Input\"\n description = \"Get chat inputs from the Playground.\"\n icon = \"ChatInput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n input_types=[],\n value=\"\",\n info=\"Message to be passed as input.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"User\",\n info=\"Type of sender.\",\n advanced=True,\n ),\n StrInput(\n name=\"sender_name\",\n type=str,\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=\"User\",\n advanced=True,\n ),\n StrInput(\n name=\"session_id\", type=str, display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, (Message, str)) and isinstance(message.text, str):\n self.store_message(message)\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\nfrom langflow.field_typing import Text\n\n\nclass ChatInput(ChatComponent):\n display_name = \"Chat Input\"\n description = \"Get chat inputs from the Playground.\"\n icon = \"ChatInput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n input_types=[],\n value=\"\",\n info=\"Message to be passed as input.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"User\",\n info=\"Type of sender.\",\n advanced=True,\n ),\n StrInput(\n name=\"sender_name\",\n type=str,\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=\"User\",\n advanced=True,\n ),\n StrInput(\n name=\"session_id\", type=str, display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n\n def text_response(self) -> Text:\n text = self.message_response().text\n return text\n"
},
"input_value": {
"advanced": false,
@ -209,12 +256,17 @@
"fileTypes": [],
"file_path": "",
"info": "Type of sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User"],
"options": [
"Machine",
"User"
],
"password": false,
"placeholder": "",
"required": false,
@ -230,7 +282,9 @@
"fileTypes": [],
"file_path": "",
"info": "Name of the sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -250,7 +304,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID for the message.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -286,7 +342,12 @@
"data": {
"id": "ChatOutput-P1jEe",
"node": {
"base_classes": ["Text", "object", "Record", "str"],
"base_classes": [
"Text",
"object",
"Record",
"str"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -310,7 +371,20 @@
"method": "message_response",
"name": "message",
"selected": "Message",
"types": ["Message"],
"types": [
"Message"
],
"value": "__UNDEFINED__"
},
{
"cache": true,
"display_name": "Text",
"method": "text_response",
"name": "text",
"selected": "Text",
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -332,7 +406,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import BoolInput, DropdownInput, MultilineInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n if isinstance(self.input_value, Message):\n message = self.input_value\n else:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n\n def text_response(self) -> Text:\n text = self.message_response().text\n return text\n"
},
"input_value": {
"advanced": false,
@ -341,7 +415,9 @@
"fileTypes": [],
"file_path": "",
"info": "Message to be passed as output.",
"input_types": ["Text", "Message"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -361,12 +437,17 @@
"fileTypes": [],
"file_path": "",
"info": "Type of sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User"],
"options": [
"Machine",
"User"
],
"password": false,
"placeholder": "",
"required": false,
@ -382,7 +463,9 @@
"fileTypes": [],
"file_path": "",
"info": "Name of the sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -402,7 +485,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID for the message.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -440,7 +525,11 @@
"display_name": "Chat Memory",
"id": "MemoryComponent-cdA1J",
"node": {
"base_classes": ["str", "Text", "object"],
"base_classes": [
"str",
"Text",
"object"
],
"beta": true,
"custom_fields": {
"n_messages": null,
@ -457,7 +546,9 @@
"field_order": [],
"frozen": false,
"icon": "history",
"output_types": ["Text"],
"output_types": [
"Text"
],
"outputs": [
{
"cache": true,
@ -466,7 +557,9 @@
"method": null,
"name": "text",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -516,12 +609,17 @@
"fileTypes": [],
"file_path": "",
"info": "Order of the messages.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "order",
"options": ["Ascending", "Descending"],
"options": [
"Ascending",
"Descending"
],
"password": false,
"placeholder": "",
"required": false,
@ -537,12 +635,18 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User", "Machine and User"],
"options": [
"Machine",
"User",
"Machine and User"
],
"password": false,
"placeholder": "",
"required": false,
@ -558,7 +662,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -577,7 +683,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID of the chat history.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -615,10 +723,17 @@
"display_name": "Prompt",
"id": "Prompt-ODkUx",
"node": {
"base_classes": ["Text", "str", "object"],
"base_classes": [
"Text",
"str",
"object"
],
"beta": false,
"custom_fields": {
"template": ["context", "user_message"]
"template": [
"context",
"user_message"
]
},
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
@ -641,7 +756,9 @@
"method": "build_prompt",
"name": "prompt",
"selected": "Prompt",
"types": ["Prompt"],
"types": [
"Prompt"
],
"value": "__UNDEFINED__"
},
{
@ -650,7 +767,9 @@
"method": "format_prompt",
"name": "text",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -682,7 +801,12 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Document", "Message", "Record", "Text"],
"input_types": [
"Document",
"Message",
"Record",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -702,7 +826,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -723,7 +849,12 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Document", "Message", "Record", "Text"],
"input_types": [
"Document",
"Message",
"Record",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -759,7 +890,11 @@
"data": {
"id": "OpenAIModel-9RykF",
"node": {
"base_classes": ["str", "object", "Text"],
"base_classes": [
"str",
"object",
"Text"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -797,7 +932,9 @@
"method": "text_response",
"name": "text_output",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
},
{
@ -806,7 +943,9 @@
"method": "build_model",
"name": "model_output",
"selected": "BaseLanguageModel",
"types": ["BaseLanguageModel"],
"types": [
"BaseLanguageModel"
],
"value": "__UNDEFINED__"
}
],
@ -828,7 +967,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, SecretStrInput, StrInput\nfrom langflow.inputs.inputs import IntInput\nfrom langflow.template import Output\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n )\n return output\n"
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, StrInput\nfrom langflow.template import Output\n\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n BoolInput(\n name=\"json_mode\",\n display_name=\"JSON Mode\",\n info=\"Enable JSON mode for the model output.\",\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n json_mode = self.json_mode\n seed = self.seed\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n response_format = None\n if json_mode:\n response_format = {\"type\": \"json_object\"}\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n response_format=response_format,\n seed=seed,\n )\n\n return output\n"
},
"input_value": {
"advanced": false,
@ -837,7 +976,11 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text", "Data", "Prompt"],
"input_types": [
"Text",
"Data",
"Prompt"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -857,7 +1000,9 @@
"fileTypes": [],
"file_path": "",
"info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -877,7 +1022,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -897,7 +1044,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
@ -923,8 +1072,10 @@
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": ["Text"],
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -944,7 +1095,9 @@
"fileTypes": [],
"file_path": "",
"info": "The OpenAI API Key to use for the OpenAI model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": true,
"multiline": false,
@ -964,7 +1117,9 @@
"fileTypes": [],
"file_path": "",
"info": "Stream the response from the model. Streaming works only in Chat.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -984,7 +1139,9 @@
"fileTypes": [],
"file_path": "",
"info": "System message to pass to the model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1004,7 +1161,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1040,7 +1199,11 @@
"data": {
"id": "TextOutput-vrs6T",
"node": {
"base_classes": ["str", "object", "Text"],
"base_classes": [
"str",
"object",
"Text"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -1053,7 +1216,9 @@
"field_order": [],
"frozen": false,
"icon": "type",
"output_types": ["Text"],
"output_types": [
"Text"
],
"template": {
"_type": "CustomComponent",
"code": {
@ -1081,7 +1246,10 @@
"fileTypes": [],
"file_path": "",
"info": "Text or Record to be passed as output.",
"input_types": ["Record", "Text"],
"input_types": [
"Record",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1101,7 +1269,9 @@
"fileTypes": [],
"file_path": "",
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -1147,4 +1317,4 @@
"is_component": false,
"last_tested_version": "1.0.0a0",
"name": "Memory Chatbot"
}
}

View file

@ -8,12 +8,19 @@
"dataType": "TextInput",
"id": "TextInput-sptaH",
"name": "text",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "document",
"id": "Prompt-amqBu",
"inputTypes": ["Document", "Message", "Record", "Text"],
"inputTypes": [
"Document",
"Message",
"Record",
"Text"
],
"type": "str"
}
},
@ -33,12 +40,17 @@
"dataType": "Prompt",
"id": "Prompt-amqBu",
"name": "text",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "TextOutput-2MS4a",
"inputTypes": ["Record", "Text"],
"inputTypes": [
"Record",
"Text"
],
"type": "str"
}
},
@ -58,12 +70,18 @@
"dataType": "Prompt",
"id": "Prompt-amqBu",
"name": "prompt",
"output_types": ["Prompt"]
"output_types": [
"Prompt"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "OpenAIModel-uYXZJ",
"inputTypes": ["Text", "Data", "Prompt"],
"inputTypes": [
"Text",
"Data",
"Prompt"
],
"type": "str"
}
},
@ -83,12 +101,19 @@
"dataType": "OpenAIModel",
"id": "OpenAIModel-uYXZJ",
"name": "text_output",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "summary",
"id": "Prompt-gTNiz",
"inputTypes": ["Document", "Message", "Record", "Text"],
"inputTypes": [
"Document",
"Message",
"Record",
"Text"
],
"type": "str"
}
},
@ -108,12 +133,16 @@
"dataType": "OpenAIModel",
"id": "OpenAIModel-uYXZJ",
"name": "text_output",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-EJkG3",
"inputTypes": ["Text", "Message"],
"inputTypes": [
"Text"
],
"type": "str"
}
},
@ -124,7 +153,7 @@
"stroke": "#555"
},
"target": "ChatOutput-EJkG3",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-EJkG3œ, œinputTypesœ: [œTextœ, œMessageœ], œtypeœ: œstrœ}"
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-EJkG3œ, œinputTypesœ: [œTextœ], œtypeœ: œstrœ}"
},
{
"className": "stroke-gray-900 stroke-connection",
@ -133,12 +162,17 @@
"dataType": "Prompt",
"id": "Prompt-gTNiz",
"name": "text",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "TextOutput-MUDOR",
"inputTypes": ["Record", "Text"],
"inputTypes": [
"Record",
"Text"
],
"type": "str"
}
},
@ -158,12 +192,18 @@
"dataType": "Prompt",
"id": "Prompt-gTNiz",
"name": "prompt",
"output_types": ["Prompt"]
"output_types": [
"Prompt"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "OpenAIModel-XawYB",
"inputTypes": ["Text", "Data", "Prompt"],
"inputTypes": [
"Text",
"Data",
"Prompt"
],
"type": "str"
}
},
@ -183,12 +223,16 @@
"dataType": "OpenAIModel",
"id": "OpenAIModel-XawYB",
"name": "text_output",
"output_types": ["Text"]
"output_types": [
"Text"
]
},
"targetHandle": {
"fieldName": "input_value",
"id": "ChatOutput-DNmvg",
"inputTypes": ["Text", "Message"],
"inputTypes": [
"Text"
],
"type": "str"
}
},
@ -199,7 +243,7 @@
"stroke": "#555"
},
"target": "ChatOutput-DNmvg",
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-DNmvgœ, œinputTypesœ: [œTextœ, œMessageœ], œtypeœ: œstrœ}"
"targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-DNmvgœ, œinputTypesœ: [œTextœ], œtypeœ: œstrœ}"
}
],
"nodes": [
@ -209,10 +253,16 @@
"display_name": "Prompt",
"id": "Prompt-amqBu",
"node": {
"base_classes": ["object", "str", "Text"],
"base_classes": [
"object",
"str",
"Text"
],
"beta": false,
"custom_fields": {
"template": ["document"]
"template": [
"document"
]
},
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
@ -235,7 +285,9 @@
"method": "build_prompt",
"name": "prompt",
"selected": "Prompt",
"types": ["Prompt"],
"types": [
"Prompt"
],
"value": "__UNDEFINED__"
},
{
@ -244,7 +296,9 @@
"method": "format_prompt",
"name": "text",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -276,7 +330,12 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Document", "Message", "Record", "Text"],
"input_types": [
"Document",
"Message",
"Record",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -296,7 +355,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -334,10 +395,16 @@
"display_name": "Prompt",
"id": "Prompt-gTNiz",
"node": {
"base_classes": ["object", "str", "Text"],
"base_classes": [
"object",
"str",
"Text"
],
"beta": false,
"custom_fields": {
"template": ["summary"]
"template": [
"summary"
]
},
"description": "Create a prompt template with dynamic variables.",
"display_name": "Prompt",
@ -360,7 +427,9 @@
"method": "build_prompt",
"name": "prompt",
"selected": "Prompt",
"types": ["Prompt"],
"types": [
"Prompt"
],
"value": "__UNDEFINED__"
},
{
@ -369,7 +438,9 @@
"method": "format_prompt",
"name": "text",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -401,7 +472,12 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Document", "Message", "Record", "Text"],
"input_types": [
"Document",
"Message",
"Record",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -421,7 +497,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -453,7 +531,12 @@
"data": {
"id": "ChatOutput-EJkG3",
"node": {
"base_classes": ["object", "Record", "Text", "str"],
"base_classes": [
"object",
"Record",
"Text",
"str"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -478,7 +561,20 @@
"method": "message_response",
"name": "message",
"selected": "Message",
"types": ["Message"],
"types": [
"Message"
],
"value": "__UNDEFINED__"
},
{
"cache": true,
"display_name": "Text",
"method": "text_response",
"name": "text",
"selected": "Text",
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -500,7 +596,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import BoolInput, DropdownInput, MultilineInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n if isinstance(self.input_value, Message):\n message = self.input_value\n else:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n\n def text_response(self) -> Text:\n text = self.message_response().text\n return text\n"
},
"input_value": {
"advanced": false,
@ -509,7 +605,9 @@
"fileTypes": [],
"file_path": "",
"info": "Message to be passed as output.",
"input_types": ["Text", "Message"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -529,12 +627,17 @@
"fileTypes": [],
"file_path": "",
"info": "Type of sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User"],
"options": [
"Machine",
"User"
],
"password": false,
"placeholder": "",
"required": false,
@ -550,7 +653,9 @@
"fileTypes": [],
"file_path": "",
"info": "Name of the sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -570,7 +675,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID for the message.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -602,7 +709,12 @@
"data": {
"id": "ChatOutput-DNmvg",
"node": {
"base_classes": ["object", "Record", "Text", "str"],
"base_classes": [
"object",
"Record",
"Text",
"str"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -627,7 +739,20 @@
"method": "message_response",
"name": "message",
"selected": "Message",
"types": ["Message"],
"types": [
"Message"
],
"value": "__UNDEFINED__"
},
{
"cache": true,
"display_name": "Text",
"method": "text_response",
"name": "text",
"selected": "Text",
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -649,7 +774,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import BoolInput, DropdownInput, MultilineInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n if isinstance(self.input_value, Message):\n message = self.input_value\n else:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n\n def text_response(self) -> Text:\n text = self.message_response().text\n return text\n"
},
"input_value": {
"advanced": false,
@ -658,7 +783,9 @@
"fileTypes": [],
"file_path": "",
"info": "Message to be passed as output.",
"input_types": ["Text", "Message"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -678,12 +805,17 @@
"fileTypes": [],
"file_path": "",
"info": "Type of sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
"name": "sender",
"options": ["Machine", "User"],
"options": [
"Machine",
"User"
],
"password": false,
"placeholder": "",
"required": false,
@ -699,7 +831,9 @@
"fileTypes": [],
"file_path": "",
"info": "Name of the sender.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -719,7 +853,9 @@
"fileTypes": [],
"file_path": "",
"info": "Session ID for the message.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -750,7 +886,11 @@
"data": {
"id": "TextInput-sptaH",
"node": {
"base_classes": ["str", "Text", "object"],
"base_classes": [
"str",
"Text",
"object"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -771,7 +911,9 @@
"method": "text_response",
"name": "text",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
}
],
@ -793,7 +935,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.text import TextComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import MultilineInput, StrInput\nfrom langflow.template import Output\n\n\nclass TextInput(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n MultilineInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n advanced=True,\n value=\"{text}\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Text:\n return self.build(input_value=self.input_value, data_template=self.data_template)\n"
"value": "from langflow.base.io.text import TextComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import StrInput\nfrom langflow.template import Output\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Text:\n return self.build(input_value=self.input_value)\n"
},
"input_value": {
"advanced": false,
@ -802,7 +944,9 @@
"fileTypes": [],
"file_path": "",
"info": "Text to be passed as input.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -838,7 +982,11 @@
"data": {
"id": "TextOutput-2MS4a",
"node": {
"base_classes": ["str", "Text", "object"],
"base_classes": [
"str",
"Text",
"object"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -851,7 +999,9 @@
"field_order": [],
"frozen": false,
"icon": "type",
"output_types": ["Text"],
"output_types": [
"Text"
],
"template": {
"_type": "CustomComponent",
"code": {
@ -879,7 +1029,10 @@
"fileTypes": [],
"file_path": "",
"info": "Text or Record to be passed as output.",
"input_types": ["Record", "Text"],
"input_types": [
"Record",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -899,7 +1052,9 @@
"fileTypes": [],
"file_path": "",
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -935,7 +1090,11 @@
"data": {
"id": "OpenAIModel-uYXZJ",
"node": {
"base_classes": ["str", "Text", "object"],
"base_classes": [
"str",
"Text",
"object"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -973,7 +1132,9 @@
"method": "text_response",
"name": "text_output",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
},
{
@ -982,7 +1143,9 @@
"method": "build_model",
"name": "model_output",
"selected": "BaseLanguageModel",
"types": ["BaseLanguageModel"],
"types": [
"BaseLanguageModel"
],
"value": "__UNDEFINED__"
}
],
@ -1004,7 +1167,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, SecretStrInput, StrInput\nfrom langflow.inputs.inputs import IntInput\nfrom langflow.template import Output\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n )\n return output\n"
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, StrInput\nfrom langflow.template import Output\n\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n BoolInput(\n name=\"json_mode\",\n display_name=\"JSON Mode\",\n info=\"Enable JSON mode for the model output.\",\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n json_mode = self.json_mode\n seed = self.seed\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n response_format = None\n if json_mode:\n response_format = {\"type\": \"json_object\"}\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n response_format=response_format,\n seed=seed,\n )\n\n return output\n"
},
"input_value": {
"advanced": false,
@ -1013,7 +1176,11 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text", "Data", "Prompt"],
"input_types": [
"Text",
"Data",
"Prompt"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1033,7 +1200,9 @@
"fileTypes": [],
"file_path": "",
"info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1053,7 +1222,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1073,7 +1244,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
@ -1099,8 +1272,10 @@
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": ["Text"],
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1120,7 +1295,9 @@
"fileTypes": [],
"file_path": "",
"info": "The OpenAI API Key to use for the OpenAI model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": true,
"multiline": false,
@ -1140,7 +1317,9 @@
"fileTypes": [],
"file_path": "",
"info": "Stream the response from the model. Streaming works only in Chat.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1160,7 +1339,9 @@
"fileTypes": [],
"file_path": "",
"info": "System message to pass to the model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1180,7 +1361,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1216,7 +1399,11 @@
"data": {
"id": "TextOutput-MUDOR",
"node": {
"base_classes": ["str", "Text", "object"],
"base_classes": [
"str",
"Text",
"object"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -1229,7 +1416,9 @@
"field_order": [],
"frozen": false,
"icon": "type",
"output_types": ["Text"],
"output_types": [
"Text"
],
"template": {
"_type": "CustomComponent",
"code": {
@ -1257,7 +1446,10 @@
"fileTypes": [],
"file_path": "",
"info": "Text or Record to be passed as output.",
"input_types": ["Record", "Text"],
"input_types": [
"Record",
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1277,7 +1469,9 @@
"fileTypes": [],
"file_path": "",
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
@ -1313,7 +1507,11 @@
"data": {
"id": "OpenAIModel-XawYB",
"node": {
"base_classes": ["str", "Text", "object"],
"base_classes": [
"str",
"Text",
"object"
],
"beta": false,
"custom_fields": {
"input_value": null,
@ -1351,7 +1549,9 @@
"method": "text_response",
"name": "text_output",
"selected": "Text",
"types": ["Text"],
"types": [
"Text"
],
"value": "__UNDEFINED__"
},
{
@ -1360,7 +1560,9 @@
"method": "build_model",
"name": "model_output",
"selected": "BaseLanguageModel",
"types": ["BaseLanguageModel"],
"types": [
"BaseLanguageModel"
],
"value": "__UNDEFINED__"
}
],
@ -1382,7 +1584,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, SecretStrInput, StrInput\nfrom langflow.inputs.inputs import IntInput\nfrom langflow.template import Output\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n )\n return output\n"
"value": "from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel, Text\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, StrInput\nfrom langflow.template import Output\n\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n StrInput(name=\"input_value\", display_name=\"Input\", input_types=[\"Text\", \"Data\", \"Prompt\"]),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n BoolInput(\n name=\"json_mode\",\n display_name=\"JSON Mode\",\n info=\"Enable JSON mode for the model output.\",\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Text:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n json_mode = self.json_mode\n seed = self.seed\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n response_format = None\n if json_mode:\n response_format = {\"type\": \"json_object\"}\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n response_format=response_format,\n seed=seed,\n )\n\n return output\n"
},
"input_value": {
"advanced": false,
@ -1391,7 +1593,11 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text", "Data", "Prompt"],
"input_types": [
"Text",
"Data",
"Prompt"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1411,7 +1617,9 @@
"fileTypes": [],
"file_path": "",
"info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1431,7 +1639,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1451,7 +1661,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": true,
"load_from_db": false,
"multiline": false,
@ -1477,8 +1689,10 @@
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": ["Text"],
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1498,7 +1712,9 @@
"fileTypes": [],
"file_path": "",
"info": "The OpenAI API Key to use for the OpenAI model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": true,
"multiline": false,
@ -1518,7 +1734,9 @@
"fileTypes": [],
"file_path": "",
"info": "Stream the response from the model. Streaming works only in Chat.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1538,7 +1756,9 @@
"fileTypes": [],
"file_path": "",
"info": "System message to pass to the model.",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1558,7 +1778,9 @@
"fileTypes": [],
"file_path": "",
"info": "",
"input_types": ["Text"],
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
@ -1602,4 +1824,4 @@
"is_component": false,
"last_tested_version": "1.0.0a0",
"name": "Prompt Chaining"
}
}

File diff suppressed because one or more lines are too long

View file

@ -1,15 +1,13 @@
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
from loguru import logger
from pydantic import BaseModel
from langflow.graph.graph.base import Graph
from langflow.graph.schema import RunOutputs
from langflow.graph.vertex.base import Vertex
from langflow.schema.graph import InputValue, Tweaks
from langflow.schema.schema import INPUT_FIELD_NAME
from langflow.services.deps import get_settings_service
from langflow.services.session.service import SessionService
from loguru import logger
from pydantic import BaseModel
if TYPE_CHECKING:
from langflow.api.v1.schemas import InputValueRequest
@ -27,18 +25,13 @@ async def run_graph_internal(
session_id: Optional[str] = None,
inputs: Optional[List["InputValueRequest"]] = None,
outputs: Optional[List[str]] = None,
artifacts: Optional[Dict[str, Any]] = None,
session_service: Optional[SessionService] = None,
) -> tuple[List[RunOutputs], str]:
"""Run the graph and generate the result"""
inputs = inputs or []
graph_data = graph._graph_data
if session_id is None and session_service is not None:
session_id_str = session_service.generate_key(session_id=flow_id, data_graph=graph_data)
elif session_id is not None:
session_id_str = session_id
if session_id is None:
session_id_str = flow_id
else:
raise ValueError("session_id or session_service must be provided")
session_id_str = session_id
components = []
inputs_list = []
types = []
@ -53,16 +46,14 @@ async def run_graph_internal(
fallback_to_env_vars = get_settings_service().settings.fallback_to_env_var
run_outputs = await graph.arun(
inputs_list,
components,
types,
outputs or [],
inputs=inputs_list,
inputs_components=components,
types=types,
outputs=outputs or [],
stream=stream,
session_id=session_id_str or "",
fallback_to_env_vars=fallback_to_env_vars,
)
if session_id_str and session_service:
await session_service.update_session(session_id_str, (graph, artifacts))
return run_outputs, session_id_str

View file

@ -4,19 +4,21 @@ from typing import TYPE_CHECKING, List, Optional, Union
import duckdb
from langflow.services.base import Service
from langflow.services.monitor.schema import MessageModel, TransactionModel, VertexBuildModel
from langflow.services.monitor.utils import add_row_to_table, drop_and_create_table_if_schema_mismatch
from loguru import logger
from platformdirs import user_cache_dir
if TYPE_CHECKING:
from langflow.services.settings.manager import SettingsService
from langflow.services.monitor.schema import MessageModel, TransactionModel, VertexBuildModel
class MonitorService(Service):
name = "monitor_service"
def __init__(self, settings_service: "SettingsService"):
from langflow.services.monitor.schema import MessageModel, TransactionModel, VertexBuildModel
self.settings_service = settings_service
self.base_cache_dir = Path(user_cache_dir("langflow"))
self.db_path = self.base_cache_dir / "monitor.duckdb"
@ -45,7 +47,7 @@ class MonitorService(Service):
def add_row(
self,
table_name: str,
data: Union[dict, TransactionModel, MessageModel, VertexBuildModel],
data: Union[dict, "TransactionModel", "MessageModel", "VertexBuildModel"],
):
# Make sure the model passed matches the table
@ -127,7 +129,7 @@ class MonitorService(Service):
return self.exec_query(query, read_only=False)
def add_message(self, message: MessageModel):
def add_message(self, message: "MessageModel"):
self.add_row("messages", message)
def get_messages(

View file

@ -337,6 +337,17 @@ files = [
[package.dependencies]
pycparser = "*"
[[package]]
name = "chardet"
version = "5.2.0"
description = "Universal encoding detector for Python 3"
optional = false
python-versions = ">=3.7"
files = [
{file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"},
{file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"},
]
[[package]]
name = "charset-normalizer"
version = "3.3.2"
@ -1158,19 +1169,19 @@ files = [
[[package]]
name = "langchain"
version = "0.2.4"
version = "0.2.5"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langchain-0.2.4-py3-none-any.whl", hash = "sha256:a04813215c30f944df006031e2febde872af8fab628dcee825d969e07b6cd621"},
{file = "langchain-0.2.4.tar.gz", hash = "sha256:e704b5b06222d5eba2d02c76f891321d1bac8952ed54e093831b2bdabf99dcd5"},
{file = "langchain-0.2.5-py3-none-any.whl", hash = "sha256:9aded9a65348254e1c93dcdaacffe4d1b6a5e7f74ef80c160c88ff78ad299228"},
{file = "langchain-0.2.5.tar.gz", hash = "sha256:ffdbf4fcea46a10d461bcbda2402220fcfd72a0c70e9f4161ae0510067b9b3bd"},
]
[package.dependencies]
aiohttp = ">=3.8.3,<4.0.0"
async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""}
langchain-core = ">=0.2.6,<0.3.0"
langchain-core = ">=0.2.7,<0.3.0"
langchain-text-splitters = ">=0.2.0,<0.3.0"
langsmith = ">=0.1.17,<0.2.0"
numpy = [
@ -1185,22 +1196,25 @@ tenacity = ">=8.1.0,<9.0.0"
[[package]]
name = "langchain-community"
version = "0.2.4"
version = "0.2.5"
description = "Community contributed LangChain integrations."
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langchain_community-0.2.4-py3-none-any.whl", hash = "sha256:8582e9800f4837660dc297cccd2ee1ddc1d8c440d0fe8b64edb07620f0373b0e"},
{file = "langchain_community-0.2.4.tar.gz", hash = "sha256:2bb6a1a36b8500a564d25d76469c02457b1a7c3afea6d4a609a47c06b993e3e4"},
{file = "langchain_community-0.2.5-py3-none-any.whl", hash = "sha256:bf37a334952e42c7676d083cf2d2c4cbfbb7de1949c4149fe19913e2b06c485f"},
{file = "langchain_community-0.2.5.tar.gz", hash = "sha256:476787b8c8c213b67e7b0eceb53346e787f00fbae12d8e680985bd4f93b0bf64"},
]
[package.dependencies]
aiohttp = ">=3.8.3,<4.0.0"
dataclasses-json = ">=0.5.7,<0.7"
langchain = ">=0.2.0,<0.3.0"
langchain-core = ">=0.2.0,<0.3.0"
langchain = ">=0.2.5,<0.3.0"
langchain-core = ">=0.2.7,<0.3.0"
langsmith = ">=0.1.0,<0.2.0"
numpy = ">=1,<2"
numpy = [
{version = ">=1,<2", markers = "python_version < \"3.12\""},
{version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""},
]
PyYAML = ">=5.3"
requests = ">=2,<3"
SQLAlchemy = ">=1.4,<3"
@ -1208,13 +1222,13 @@ tenacity = ">=8.1.0,<9.0.0"
[[package]]
name = "langchain-core"
version = "0.2.6"
version = "0.2.7"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langchain_core-0.2.6-py3-none-any.whl", hash = "sha256:90521c9fc95d8f925e0d2e2d952382676aea6d3f8de611eda1b1810874c31e5d"},
{file = "langchain_core-0.2.6.tar.gz", hash = "sha256:9f0e38da722a558a6e95b6d86de01bd92e84558c47ac8ba599f02eab70a1c873"},
{file = "langchain_core-0.2.7-py3-none-any.whl", hash = "sha256:fd02e153c898486dd728d634684ffc64bc257ff2ba443dc7e53d017ac0bf4658"},
{file = "langchain_core-0.2.7.tar.gz", hash = "sha256:b0b1b6dfbdedb39426fcb8bd3f07e40eec7964856e3fc384c420ca6dba61b34e"},
]
[package.dependencies]
@ -1227,21 +1241,18 @@ tenacity = ">=8.1.0,<9.0.0"
[[package]]
name = "langchain-experimental"
version = "0.0.60"
version = "0.0.61"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langchain_experimental-0.0.60-py3-none-any.whl", hash = "sha256:ef3b6b6b84fe2bfe19eba6d1a98005e27d96576514c6415f5afe4ace5bf477d8"},
{file = "langchain_experimental-0.0.60.tar.gz", hash = "sha256:a16cbcd18cda6b86be8f41fed7963c13569295def0d8b4c6324b806d878d442c"},
{file = "langchain_experimental-0.0.61-py3-none-any.whl", hash = "sha256:f9c516f528f55919743bd56fe1689a53bf74ae7f8902d64b9d8aebc61249cbe2"},
{file = "langchain_experimental-0.0.61.tar.gz", hash = "sha256:e9538efb994be5db3045cc582cddb9787c8299c86ffeee9d3779b7f58eef2226"},
]
[package.dependencies]
langchain-community = ">=0.2,<0.3"
langchain-core = ">=0.2,<0.3"
[package.extras]
extended-testing = ["faker (>=19.3.1,<20.0.0)", "jinja2 (>=3,<4)", "pandas (>=2.0.1,<3.0.0)", "presidio-analyzer (>=2.2.352,<3.0.0)", "presidio-anonymizer (>=2.2.352,<3.0.0)", "sentence-transformers (>=2,<3)", "tabulate (>=0.9.0,<0.10.0)", "vowpal-wabbit-next (==0.6.0)"]
langchain-community = ">=0.2.5,<0.3.0"
langchain-core = ">=0.2.7,<0.3.0"
[[package]]
name = "langchain-text-splitters"
@ -3297,4 +3308,4 @@ local = []
[metadata]
lock-version = "2.0"
python-versions = ">=3.10,<3.13"
content-hash = "72f05330f1e734596d160b45cb68ab2ebf7d0824314bec0566bddb5b2043f4e6"
content-hash = "73dc20fcd3c34d40dd31c9251efc8e2d8d3346f2f1bc18be516acf57c86ce460"

View file

@ -1,6 +1,6 @@
[tool.poetry]
name = "langflow-base"
version = "0.0.68"
version = "0.0.70"
description = "A Python package with a built-in web application"
authors = ["Langflow <contact@langflow.org>"]
maintainers = [
@ -64,6 +64,7 @@ asyncer = "^0.0.5"
pyperclip = "^1.8.2"
uncurl = "^0.0.11"
sentry-sdk = "^2.5.1"
chardet = "^5.2.0"
[tool.poetry.extras]