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.
Files changed (74) hide show
  1. langgraph_agent_toolkit/__init__.py +7 -0
  2. langgraph_agent_toolkit/agents/__init__.py +0 -0
  3. langgraph_agent_toolkit/agents/agent.py +14 -0
  4. langgraph_agent_toolkit/agents/agent_executor.py +415 -0
  5. langgraph_agent_toolkit/agents/blueprints/__init__.py +0 -0
  6. langgraph_agent_toolkit/agents/blueprints/bg_task_agent/__init__.py +0 -0
  7. langgraph_agent_toolkit/agents/blueprints/bg_task_agent/agent.py +69 -0
  8. langgraph_agent_toolkit/agents/blueprints/bg_task_agent/task.py +52 -0
  9. langgraph_agent_toolkit/agents/blueprints/bg_task_agent/utils.py +17 -0
  10. langgraph_agent_toolkit/agents/blueprints/chatbot/__init__.py +0 -0
  11. langgraph_agent_toolkit/agents/blueprints/chatbot/agent.py +34 -0
  12. langgraph_agent_toolkit/agents/blueprints/command_agent/__init__.py +0 -0
  13. langgraph_agent_toolkit/agents/blueprints/command_agent/agent.py +54 -0
  14. langgraph_agent_toolkit/agents/blueprints/interrupt_agent/__init__.py +0 -0
  15. langgraph_agent_toolkit/agents/blueprints/interrupt_agent/agent.py +140 -0
  16. langgraph_agent_toolkit/agents/blueprints/react/__init__.py +0 -0
  17. langgraph_agent_toolkit/agents/blueprints/react/agent.py +67 -0
  18. langgraph_agent_toolkit/agents/blueprints/react_so/__init__.py +0 -0
  19. langgraph_agent_toolkit/agents/blueprints/react_so/agent.py +39 -0
  20. langgraph_agent_toolkit/agents/blueprints/supervisor_agent/__init__.py +0 -0
  21. langgraph_agent_toolkit/agents/blueprints/supervisor_agent/agent.py +44 -0
  22. langgraph_agent_toolkit/agents/components/__init__.py +0 -0
  23. langgraph_agent_toolkit/agents/components/creators/__init__.py +4 -0
  24. langgraph_agent_toolkit/agents/components/creators/create_react_agent.py +459 -0
  25. langgraph_agent_toolkit/agents/components/tools.py +13 -0
  26. langgraph_agent_toolkit/agents/components/utils.py +42 -0
  27. langgraph_agent_toolkit/client/__init__.py +4 -0
  28. langgraph_agent_toolkit/client/client.py +344 -0
  29. langgraph_agent_toolkit/core/__init__.py +5 -0
  30. langgraph_agent_toolkit/core/memory/__init__.py +0 -0
  31. langgraph_agent_toolkit/core/memory/base.py +33 -0
  32. langgraph_agent_toolkit/core/memory/factory.py +30 -0
  33. langgraph_agent_toolkit/core/memory/postgres.py +76 -0
  34. langgraph_agent_toolkit/core/memory/sqlite.py +21 -0
  35. langgraph_agent_toolkit/core/memory/types.py +6 -0
  36. langgraph_agent_toolkit/core/models/__init__.py +5 -0
  37. langgraph_agent_toolkit/core/models/chat_openai.py +21 -0
  38. langgraph_agent_toolkit/core/models/factory.py +118 -0
  39. langgraph_agent_toolkit/core/models/fake.py +25 -0
  40. langgraph_agent_toolkit/core/observability/__init__.py +10 -0
  41. langgraph_agent_toolkit/core/observability/base.py +331 -0
  42. langgraph_agent_toolkit/core/observability/empty.py +67 -0
  43. langgraph_agent_toolkit/core/observability/factory.py +43 -0
  44. langgraph_agent_toolkit/core/observability/langfuse.py +118 -0
  45. langgraph_agent_toolkit/core/observability/langsmith.py +131 -0
  46. langgraph_agent_toolkit/core/observability/types.py +34 -0
  47. langgraph_agent_toolkit/core/prompts/__init__.py +0 -0
  48. langgraph_agent_toolkit/core/prompts/chat_prompt_template.py +528 -0
  49. langgraph_agent_toolkit/core/settings.py +164 -0
  50. langgraph_agent_toolkit/helper/__init__.py +0 -0
  51. langgraph_agent_toolkit/helper/constants.py +10 -0
  52. langgraph_agent_toolkit/helper/logging.py +111 -0
  53. langgraph_agent_toolkit/helper/types.py +7 -0
  54. langgraph_agent_toolkit/helper/utils.py +80 -0
  55. langgraph_agent_toolkit/run_agent.py +68 -0
  56. langgraph_agent_toolkit/run_client.py +55 -0
  57. langgraph_agent_toolkit/run_service.py +19 -0
  58. langgraph_agent_toolkit/schema/__init__.py +28 -0
  59. langgraph_agent_toolkit/schema/models.py +25 -0
  60. langgraph_agent_toolkit/schema/schema.py +210 -0
  61. langgraph_agent_toolkit/schema/task_data.py +72 -0
  62. langgraph_agent_toolkit/service/__init__.py +0 -0
  63. langgraph_agent_toolkit/service/exception_handlers.py +46 -0
  64. langgraph_agent_toolkit/service/factory.py +213 -0
  65. langgraph_agent_toolkit/service/handler.py +122 -0
  66. langgraph_agent_toolkit/service/middleware.py +18 -0
  67. langgraph_agent_toolkit/service/routes.py +169 -0
  68. langgraph_agent_toolkit/service/types.py +8 -0
  69. langgraph_agent_toolkit/service/utils.py +136 -0
  70. langgraph_agent_toolkit/streamlit_app.py +368 -0
  71. langgraph_agent_toolkit-0.1.0.dist-info/METADATA +424 -0
  72. langgraph_agent_toolkit-0.1.0.dist-info/RECORD +74 -0
  73. langgraph_agent_toolkit-0.1.0.dist-info/WHEEL +4 -0
  74. 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