langgraph-api 0.0.3__tar.gz → 0.0.4__tar.gz

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.

Potentially problematic release.


This version of langgraph-api might be problematic. Click here for more details.

Files changed (85) hide show
  1. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/PKG-INFO +2 -2
  2. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/cli.py +30 -0
  3. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/stream.py +12 -8
  4. langgraph_api-0.0.4/langgraph_storage/store.py +44 -0
  5. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/pyproject.toml +2 -2
  6. langgraph_api-0.0.3/langgraph_storage/store.py +0 -28
  7. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/LICENSE +0 -0
  8. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/README.md +0 -0
  9. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/__init__.py +0 -0
  10. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/api/__init__.py +0 -0
  11. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/api/assistants.py +0 -0
  12. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/api/meta.py +0 -0
  13. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/api/openapi.py +0 -0
  14. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/api/runs.py +0 -0
  15. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/api/store.py +0 -0
  16. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/api/threads.py +0 -0
  17. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/asyncio.py +0 -0
  18. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/auth/__init__.py +0 -0
  19. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/auth/langsmith/__init__.py +0 -0
  20. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/auth/langsmith/backend.py +0 -0
  21. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/auth/langsmith/client.py +0 -0
  22. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/auth/middleware.py +0 -0
  23. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/auth/noop.py +0 -0
  24. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/config.py +0 -0
  25. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/cron_scheduler.py +0 -0
  26. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/errors.py +0 -0
  27. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/graph.py +0 -0
  28. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/http.py +0 -0
  29. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/http_logger.py +0 -0
  30. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/.gitignore +0 -0
  31. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/build.mts +0 -0
  32. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/client.mts +0 -0
  33. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/global.d.ts +0 -0
  34. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/package.json +0 -0
  35. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/remote.py +0 -0
  36. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/server_sent_events.py +0 -0
  37. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/src/graph.mts +0 -0
  38. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/src/hooks.mjs +0 -0
  39. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/src/parser/parser.mts +0 -0
  40. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/src/parser/parser.worker.mjs +0 -0
  41. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/src/schema/types.mts +0 -0
  42. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/src/schema/types.template.mts +0 -0
  43. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/src/utils/importMap.mts +0 -0
  44. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  45. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/src/utils/serde.mts +0 -0
  46. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/api.test.mts +0 -0
  47. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/compose-postgres.yml +0 -0
  48. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/graphs/.gitignore +0 -0
  49. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/graphs/agent.mts +0 -0
  50. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/graphs/error.mts +0 -0
  51. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/graphs/langgraph.json +0 -0
  52. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/graphs/nested.mts +0 -0
  53. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/graphs/package.json +0 -0
  54. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/graphs/weather.mts +0 -0
  55. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/graphs/yarn.lock +0 -0
  56. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/parser.test.mts +0 -0
  57. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/tests/utils.mts +0 -0
  58. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/js/yarn.lock +0 -0
  59. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/lifespan.py +0 -0
  60. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/logging.py +0 -0
  61. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/metadata.py +0 -0
  62. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/models/__init__.py +0 -0
  63. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/models/run.py +0 -0
  64. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/patch.py +0 -0
  65. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/queue.py +0 -0
  66. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/route.py +0 -0
  67. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/schema.py +0 -0
  68. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/serde.py +0 -0
  69. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/server.py +0 -0
  70. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/sse.py +0 -0
  71. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/state.py +0 -0
  72. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/utils.py +0 -0
  73. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_api/validation.py +0 -0
  74. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_license/__init__.py +0 -0
  75. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_license/middleware.py +0 -0
  76. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_license/validation.py +0 -0
  77. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_storage/__init__.py +0 -0
  78. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_storage/checkpoint.py +0 -0
  79. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_storage/database.py +0 -0
  80. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_storage/ops.py +0 -0
  81. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_storage/queue.py +0 -0
  82. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_storage/retry.py +0 -0
  83. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/langgraph_storage/ttl_dict.py +0 -0
  84. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/logging.json +0 -0
  85. {langgraph_api-0.0.3 → langgraph_api-0.0.4}/openapi.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langgraph-api
3
- Version: 0.0.3
3
+ Version: 0.0.4
4
4
  Summary:
5
5
  License: Elastic-2.0
6
6
  Author: Nuno Campos
@@ -15,7 +15,7 @@ Requires-Dist: httpx (>=0.27.0)
15
15
  Requires-Dist: jsonschema-rs (>=0.25.0,<0.26.0)
16
16
  Requires-Dist: langchain-core (>=0.2.38,<0.4.0)
17
17
  Requires-Dist: langgraph (>=0.2.52,<0.3.0)
18
- Requires-Dist: langgraph-checkpoint (>=2.0.5,<3.0)
18
+ Requires-Dist: langgraph-checkpoint (>=2.0.6,<3.0)
19
19
  Requires-Dist: langsmith (>=0.1.63,<0.2.0)
20
20
  Requires-Dist: orjson (>=3.10.1)
21
21
  Requires-Dist: pyjwt (>=2.9.0,<3.0.0)
@@ -10,6 +10,29 @@ logging.basicConfig(level=logging.INFO)
10
10
  logger = logging.getLogger(__name__)
11
11
 
12
12
 
13
+ def _get_org_id() -> str | None:
14
+ from langsmith.client import Client
15
+ from langsmith.utils import tracing_is_enabled
16
+
17
+ # Yes, the organizationId is actually the workspace iD
18
+ # which is actually the tenantID which we actually get via
19
+ # the sessions endpoint
20
+
21
+ if not tracing_is_enabled():
22
+ return
23
+ client = Client()
24
+ try:
25
+ response = client.request_with_retries(
26
+ "GET", "/api/v1/sessions", params={"limit": 1}
27
+ )
28
+ result = response.json()
29
+ if result:
30
+ return result[0]["tenant_id"]
31
+ except Exception as e:
32
+ logger.debug("Failed to get organization ID: %s", str(e))
33
+ return None
34
+
35
+
13
36
  @contextlib.contextmanager
14
37
  def patch_environment(**kwargs):
15
38
  """Temporarily patch environment variables.
@@ -92,14 +115,21 @@ def run_server(
92
115
  studio_url = f"https://smith.langchain.com/studio/?baseUrl={local_url}"
93
116
 
94
117
  def _open_browser():
118
+ nonlocal studio_url
95
119
  import time
96
120
  import urllib.request
97
121
  import webbrowser
98
122
 
123
+ org_id = _get_org_id()
124
+ if org_id:
125
+ studio_url = f"https://smith.langchain.com/studio/?baseUrl={local_url}&organizationId={org_id}"
126
+
99
127
  while True:
100
128
  try:
101
129
  with urllib.request.urlopen(f"{local_url}/ok") as response:
102
130
  if response.status == 200:
131
+ logger.info("🎨 Opening Studio in your browser...")
132
+ logger.info("URL: " + studio_url)
103
133
  webbrowser.open(studio_url)
104
134
  return
105
135
  except urllib.error.URLError:
@@ -94,7 +94,7 @@ async def astream_state(
94
94
  ) -> AnyStream:
95
95
  """Stream messages from the runnable."""
96
96
  run_id = str(run["run_id"])
97
- await stack.enter_async_context(conn.pipeline())
97
+ pipe = await stack.enter_async_context(conn.pipeline())
98
98
  # extract args from run
99
99
  kwargs = run["kwargs"].copy()
100
100
  subgraphs = kwargs.get("subgraphs", False)
@@ -103,7 +103,7 @@ async def astream_state(
103
103
  graph = get_graph(
104
104
  config["configurable"]["graph_id"],
105
105
  config,
106
- store=None if not conn else Store(conn),
106
+ store=None if not conn else Store(conn, pipe=pipe),
107
107
  checkpointer=None if temporary else Checkpointer(conn),
108
108
  )
109
109
  input = kwargs.pop("input")
@@ -188,9 +188,11 @@ async def astream_state(
188
188
  messages[msg.id] = msg
189
189
  yield "messages/metadata", {msg.id: {"metadata": meta}}
190
190
  yield (
191
- "messages/partial"
192
- if isinstance(msg, BaseMessageChunk)
193
- else "messages/complete",
191
+ (
192
+ "messages/partial"
193
+ if isinstance(msg, BaseMessageChunk)
194
+ else "messages/complete"
195
+ ),
194
196
  [message_chunk_to_message(messages[msg.id])],
195
197
  )
196
198
  elif mode in stream_mode:
@@ -237,9 +239,11 @@ async def astream_state(
237
239
  messages[msg.id] = msg
238
240
  yield "messages/metadata", {msg.id: {"metadata": meta}}
239
241
  yield (
240
- "messages/partial"
241
- if isinstance(msg, BaseMessageChunk)
242
- else "messages/complete",
242
+ (
243
+ "messages/partial"
244
+ if isinstance(msg, BaseMessageChunk)
245
+ else "messages/complete"
246
+ ),
243
247
  [message_chunk_to_message(messages[msg.id])],
244
248
  )
245
249
  elif mode in stream_mode:
@@ -0,0 +1,44 @@
1
+ import os
2
+ from typing import Any
3
+
4
+ from langgraph.checkpoint.memory import PersistentDict
5
+ from langgraph.store.memory import InMemoryStore
6
+
7
+
8
+ class DiskBackedInMemStore(InMemoryStore):
9
+ def __init__(self, *args: Any, filename: str | None = None, **kwargs: Any) -> None:
10
+ super().__init__(*args, **kwargs)
11
+ self.filename = filename
12
+ self._data = PersistentDict(dict, filename=self.filename)
13
+ self._load_data()
14
+
15
+ def _load_data(self) -> None:
16
+ if not self.filename:
17
+ return
18
+ try:
19
+ self._data.load()
20
+ except FileNotFoundError:
21
+ # It's okay if the file doesn't exist yet
22
+ pass
23
+ except (EOFError, ValueError) as e:
24
+ raise RuntimeError(
25
+ f"Failed to load store from {self.filename}. "
26
+ "This may be due to changes in the stored data structure. "
27
+ "Consider clearing the local store by running: rm -rf .langgraph_api"
28
+ ) from e
29
+ except Exception as e:
30
+ raise RuntimeError(
31
+ f"Unexpected error loading store from {self.filename}: {str(e)}"
32
+ ) from e
33
+
34
+ def close(self) -> None:
35
+ self._data.close()
36
+
37
+
38
+ _STORE_FILE = os.path.join(".langgraph_api", "store.pckl")
39
+ os.makedirs(".langgraph_api", exist_ok=True)
40
+ STORE = DiskBackedInMemStore(filename=_STORE_FILE)
41
+
42
+
43
+ def Store(*args: Any, **kwargs: Any) -> DiskBackedInMemStore:
44
+ return STORE
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "langgraph-api"
3
- version = "0.0.3"
3
+ version = "0.0.4"
4
4
  description = ""
5
5
  authors = [
6
6
  "Nuno Campos <nuno@langchain.dev>",
@@ -24,7 +24,7 @@ sse-starlette = "^2.1.0"
24
24
  starlette = ">=0.38.6"
25
25
  watchfiles = ">=0.13"
26
26
  langgraph = ">=0.2.52,<0.3.0"
27
- langgraph-checkpoint = ">=2.0.5,<3.0"
27
+ langgraph-checkpoint = ">=2.0.6,<3.0"
28
28
  orjson = ">=3.10.1"
29
29
  uvicorn = ">=0.26.0"
30
30
  langsmith = "^0.1.63"
@@ -1,28 +0,0 @@
1
- import os
2
-
3
- from langgraph.checkpoint.memory import PersistentDict
4
- from langgraph.store.memory import InMemoryStore
5
-
6
-
7
- class DiskBackedInMemStore(InMemoryStore):
8
- def __init__(self, *args, filename=None, **kwargs):
9
- super().__init__(*args, **kwargs)
10
- self.filename = filename
11
- self._data = PersistentDict(dict, filename=self.filename)
12
- try:
13
- self._data.load()
14
- except FileNotFoundError:
15
- pass
16
-
17
- def close(self):
18
- self._data.close()
19
-
20
-
21
- _STORE_FILE = os.path.join(".langgraph_api", "store.pckl")
22
- if not os.path.exists(".langgraph_api"):
23
- os.mkdir(".langgraph_api")
24
- STORE = DiskBackedInMemStore(filename=_STORE_FILE)
25
-
26
-
27
- def Store(*args, **kwargs):
28
- return STORE
File without changes
File without changes