langgraph-agent-toolkit 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- langgraph_agent_toolkit/__init__.py +7 -0
- langgraph_agent_toolkit/agents/__init__.py +0 -0
- langgraph_agent_toolkit/agents/agent.py +14 -0
- langgraph_agent_toolkit/agents/agent_executor.py +415 -0
- langgraph_agent_toolkit/agents/blueprints/__init__.py +0 -0
- langgraph_agent_toolkit/agents/blueprints/bg_task_agent/__init__.py +0 -0
- langgraph_agent_toolkit/agents/blueprints/bg_task_agent/agent.py +69 -0
- langgraph_agent_toolkit/agents/blueprints/bg_task_agent/task.py +52 -0
- langgraph_agent_toolkit/agents/blueprints/bg_task_agent/utils.py +17 -0
- langgraph_agent_toolkit/agents/blueprints/chatbot/__init__.py +0 -0
- langgraph_agent_toolkit/agents/blueprints/chatbot/agent.py +34 -0
- langgraph_agent_toolkit/agents/blueprints/command_agent/__init__.py +0 -0
- langgraph_agent_toolkit/agents/blueprints/command_agent/agent.py +54 -0
- langgraph_agent_toolkit/agents/blueprints/interrupt_agent/__init__.py +0 -0
- langgraph_agent_toolkit/agents/blueprints/interrupt_agent/agent.py +140 -0
- langgraph_agent_toolkit/agents/blueprints/react/__init__.py +0 -0
- langgraph_agent_toolkit/agents/blueprints/react/agent.py +67 -0
- langgraph_agent_toolkit/agents/blueprints/react_so/__init__.py +0 -0
- langgraph_agent_toolkit/agents/blueprints/react_so/agent.py +39 -0
- langgraph_agent_toolkit/agents/blueprints/supervisor_agent/__init__.py +0 -0
- langgraph_agent_toolkit/agents/blueprints/supervisor_agent/agent.py +44 -0
- langgraph_agent_toolkit/agents/components/__init__.py +0 -0
- langgraph_agent_toolkit/agents/components/creators/__init__.py +4 -0
- langgraph_agent_toolkit/agents/components/creators/create_react_agent.py +459 -0
- langgraph_agent_toolkit/agents/components/tools.py +13 -0
- langgraph_agent_toolkit/agents/components/utils.py +42 -0
- langgraph_agent_toolkit/client/__init__.py +4 -0
- langgraph_agent_toolkit/client/client.py +344 -0
- langgraph_agent_toolkit/core/__init__.py +5 -0
- langgraph_agent_toolkit/core/memory/__init__.py +0 -0
- langgraph_agent_toolkit/core/memory/base.py +33 -0
- langgraph_agent_toolkit/core/memory/factory.py +30 -0
- langgraph_agent_toolkit/core/memory/postgres.py +76 -0
- langgraph_agent_toolkit/core/memory/sqlite.py +21 -0
- langgraph_agent_toolkit/core/memory/types.py +6 -0
- langgraph_agent_toolkit/core/models/__init__.py +5 -0
- langgraph_agent_toolkit/core/models/chat_openai.py +21 -0
- langgraph_agent_toolkit/core/models/factory.py +118 -0
- langgraph_agent_toolkit/core/models/fake.py +25 -0
- langgraph_agent_toolkit/core/observability/__init__.py +10 -0
- langgraph_agent_toolkit/core/observability/base.py +331 -0
- langgraph_agent_toolkit/core/observability/empty.py +67 -0
- langgraph_agent_toolkit/core/observability/factory.py +43 -0
- langgraph_agent_toolkit/core/observability/langfuse.py +118 -0
- langgraph_agent_toolkit/core/observability/langsmith.py +131 -0
- langgraph_agent_toolkit/core/observability/types.py +34 -0
- langgraph_agent_toolkit/core/prompts/__init__.py +0 -0
- langgraph_agent_toolkit/core/prompts/chat_prompt_template.py +528 -0
- langgraph_agent_toolkit/core/settings.py +164 -0
- langgraph_agent_toolkit/helper/__init__.py +0 -0
- langgraph_agent_toolkit/helper/constants.py +10 -0
- langgraph_agent_toolkit/helper/logging.py +111 -0
- langgraph_agent_toolkit/helper/types.py +7 -0
- langgraph_agent_toolkit/helper/utils.py +80 -0
- langgraph_agent_toolkit/run_agent.py +68 -0
- langgraph_agent_toolkit/run_client.py +55 -0
- langgraph_agent_toolkit/run_service.py +19 -0
- langgraph_agent_toolkit/schema/__init__.py +28 -0
- langgraph_agent_toolkit/schema/models.py +25 -0
- langgraph_agent_toolkit/schema/schema.py +210 -0
- langgraph_agent_toolkit/schema/task_data.py +72 -0
- langgraph_agent_toolkit/service/__init__.py +0 -0
- langgraph_agent_toolkit/service/exception_handlers.py +46 -0
- langgraph_agent_toolkit/service/factory.py +213 -0
- langgraph_agent_toolkit/service/handler.py +122 -0
- langgraph_agent_toolkit/service/middleware.py +18 -0
- langgraph_agent_toolkit/service/routes.py +169 -0
- langgraph_agent_toolkit/service/types.py +8 -0
- langgraph_agent_toolkit/service/utils.py +136 -0
- langgraph_agent_toolkit/streamlit_app.py +368 -0
- langgraph_agent_toolkit-0.1.0.dist-info/METADATA +424 -0
- langgraph_agent_toolkit-0.1.0.dist-info/RECORD +74 -0
- langgraph_agent_toolkit-0.1.0.dist-info/WHEEL +4 -0
- langgraph_agent_toolkit-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
from typing import Any, Dict, Literal, Optional
|
|
2
|
+
|
|
3
|
+
from langsmith import Client as LangsmithClient
|
|
4
|
+
from langsmith.utils import LangSmithConflictError
|
|
5
|
+
|
|
6
|
+
from langgraph_agent_toolkit.core.observability.base import BaseObservabilityPlatform
|
|
7
|
+
from langgraph_agent_toolkit.core.observability.types import PromptReturnType, PromptTemplateType
|
|
8
|
+
from langgraph_agent_toolkit.helper.logging import logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class LangsmithObservability(BaseObservabilityPlatform):
|
|
12
|
+
"""Langsmith implementation of observability platform."""
|
|
13
|
+
|
|
14
|
+
def __init__(self, prompts_dir: Optional[str] = None):
|
|
15
|
+
"""Initialize LangsmithObservability.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
prompts_dir: Optional directory to store prompts locally. If None, a system temp directory is used.
|
|
19
|
+
|
|
20
|
+
"""
|
|
21
|
+
super().__init__(prompts_dir)
|
|
22
|
+
# Set required environment variables explicitly
|
|
23
|
+
self.required_vars = ["LANGSMITH_TRACING", "LANGSMITH_API_KEY", "LANGSMITH_PROJECT", "LANGSMITH_ENDPOINT"]
|
|
24
|
+
|
|
25
|
+
@BaseObservabilityPlatform.requires_env_vars
|
|
26
|
+
def get_callback_handler(self, **kwargs) -> None:
|
|
27
|
+
"""Get the callback handler for the observability platform."""
|
|
28
|
+
return None
|
|
29
|
+
|
|
30
|
+
def before_shutdown(self) -> None:
|
|
31
|
+
"""Perform any necessary cleanup before shutdown."""
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
@BaseObservabilityPlatform.requires_env_vars
|
|
35
|
+
def record_feedback(self, run_id: str, key: str, score: float, **kwargs) -> None:
|
|
36
|
+
"""Record feedback for a run to LangSmith."""
|
|
37
|
+
client = LangsmithClient()
|
|
38
|
+
client.create_feedback(
|
|
39
|
+
run_id=run_id,
|
|
40
|
+
key=key,
|
|
41
|
+
score=score,
|
|
42
|
+
**kwargs,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
@BaseObservabilityPlatform.requires_env_vars
|
|
46
|
+
def push_prompt(
|
|
47
|
+
self,
|
|
48
|
+
name: str,
|
|
49
|
+
prompt_template: PromptTemplateType,
|
|
50
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
51
|
+
create_new_version: bool = True,
|
|
52
|
+
) -> None:
|
|
53
|
+
"""Push a prompt to LangSmith."""
|
|
54
|
+
client = LangsmithClient()
|
|
55
|
+
|
|
56
|
+
# Convert to proper format
|
|
57
|
+
prompt_obj = self._convert_to_chat_prompt(prompt_template)
|
|
58
|
+
|
|
59
|
+
# Handle existing prompt versions
|
|
60
|
+
existing_prompt, existing_url = self._handle_existing_prompt(
|
|
61
|
+
name, create_new_version, client, client_pull_method="pull_prompt", client_delete_method="delete_prompt"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
url = None
|
|
65
|
+
|
|
66
|
+
# Push to LangSmith if we don't have an existing prompt
|
|
67
|
+
if existing_prompt is None:
|
|
68
|
+
try:
|
|
69
|
+
if metadata and metadata.get("model"):
|
|
70
|
+
chain = prompt_obj | metadata["model"]
|
|
71
|
+
url = client.push_prompt(name, object=chain)
|
|
72
|
+
else:
|
|
73
|
+
url = client.push_prompt(name, object=prompt_obj)
|
|
74
|
+
logger.debug(f"Created new prompt '{name}' in LangSmith")
|
|
75
|
+
except LangSmithConflictError as e:
|
|
76
|
+
logger.debug(f"Prompt '{name}' unchanged, using existing version: {e}")
|
|
77
|
+
try:
|
|
78
|
+
# Try to retrieve the existing prompt without modifying it
|
|
79
|
+
existing_prompt = client.pull_prompt(name)
|
|
80
|
+
url = getattr(existing_prompt, "url", None)
|
|
81
|
+
logger.debug(f"Using existing prompt '{name}' due to conflict")
|
|
82
|
+
except Exception as fetch_err:
|
|
83
|
+
logger.warning(f"Failed to retrieve existing prompt after conflict: {fetch_err}")
|
|
84
|
+
else:
|
|
85
|
+
# Use the existing prompt that was found earlier
|
|
86
|
+
url = existing_url
|
|
87
|
+
logger.debug(f"Reusing existing prompt '{name}' in LangSmith")
|
|
88
|
+
|
|
89
|
+
# Update metadata and save locally
|
|
90
|
+
full_metadata = metadata.copy() if metadata else {}
|
|
91
|
+
full_metadata["langsmith_url"] = url
|
|
92
|
+
full_metadata["original_prompt"] = prompt_obj
|
|
93
|
+
|
|
94
|
+
# Extract template for local storage and save
|
|
95
|
+
template_str = self._extract_template_string(prompt_template, prompt_obj)
|
|
96
|
+
super().push_prompt(name, template_str, full_metadata)
|
|
97
|
+
|
|
98
|
+
@BaseObservabilityPlatform.requires_env_vars
|
|
99
|
+
def pull_prompt(
|
|
100
|
+
self,
|
|
101
|
+
name: str,
|
|
102
|
+
template_format: Literal["f-string", "mustache", "jinja2"] = "f-string",
|
|
103
|
+
**kwargs,
|
|
104
|
+
) -> PromptReturnType:
|
|
105
|
+
"""Pull a prompt from LangSmith."""
|
|
106
|
+
try:
|
|
107
|
+
client = LangsmithClient()
|
|
108
|
+
prompt_info = client.pull_prompt(name)
|
|
109
|
+
|
|
110
|
+
# Process the prompt into a standard format
|
|
111
|
+
return self._process_prompt_object(prompt_info, template_format=template_format)
|
|
112
|
+
|
|
113
|
+
except Exception as e:
|
|
114
|
+
logger.warning(f"Failed to pull prompt from remote platform: {e}")
|
|
115
|
+
|
|
116
|
+
# Fall back to local storage
|
|
117
|
+
return self._local_pull_prompt(name, template_format=template_format, **kwargs)
|
|
118
|
+
|
|
119
|
+
@BaseObservabilityPlatform.requires_env_vars
|
|
120
|
+
def delete_prompt(self, name: str) -> None:
|
|
121
|
+
"""Delete a prompt from LangSmith.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
name: Name of the prompt to delete
|
|
125
|
+
|
|
126
|
+
"""
|
|
127
|
+
client = LangsmithClient()
|
|
128
|
+
client.delete_prompt(name)
|
|
129
|
+
|
|
130
|
+
# Also delete the local files
|
|
131
|
+
super().delete_prompt(name)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from enum import StrEnum, auto
|
|
2
|
+
from typing import List, TypedDict, Union
|
|
3
|
+
|
|
4
|
+
from langchain_core.prompts import ChatPromptTemplate
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ObservabilityBackend(StrEnum):
|
|
8
|
+
LANGFUSE = auto()
|
|
9
|
+
LANGSMITH = auto()
|
|
10
|
+
EMPTY = auto()
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class MessageRole(StrEnum):
|
|
14
|
+
"""Enum for message roles in chat templates."""
|
|
15
|
+
|
|
16
|
+
SYSTEM = auto()
|
|
17
|
+
HUMAN = auto()
|
|
18
|
+
USER = auto()
|
|
19
|
+
AI = auto()
|
|
20
|
+
ASSISTANT = auto()
|
|
21
|
+
PLACEHOLDER = auto()
|
|
22
|
+
MESSAGES_PLACEHOLDER = auto()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ChatMessageDict(TypedDict):
|
|
26
|
+
role: str
|
|
27
|
+
content: str
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Type for prompt templates that can be provided to push_prompt
|
|
31
|
+
PromptTemplateType = Union[str, List[ChatMessageDict]]
|
|
32
|
+
|
|
33
|
+
# Type for the return value of pull_prompt
|
|
34
|
+
PromptReturnType = Union[ChatPromptTemplate, str, dict, None]
|
|
File without changes
|