From 293bc2c11f1667bc9d45ecc6c2de9ce08abf8bd3 Mon Sep 17 00:00:00 2001 From: David Duong Date: Tue, 9 Jul 2024 02:47:50 +0200 Subject: [PATCH] feat(cli): add debugger host CLI flag to specify default base URL (#900) --- libs/cli/langgraph_cli/cli.py | 18 +++++++++++- libs/cli/langgraph_cli/docker.py | 41 ++++++++++++++++++--------- libs/cli/tests/unit_tests/test_cli.py | 8 ++++-- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/libs/cli/langgraph_cli/cli.py b/libs/cli/langgraph_cli/cli.py index f75b3cdb4..119deabed 100644 --- a/libs/cli/langgraph_cli/cli.py +++ b/libs/cli/langgraph_cli/cli.py @@ -134,6 +134,12 @@ OPT_DEBUGGER_PORT = click.option( type=int, help="Pull the debugger image locally and serve the UI on specified port", ) +OPT_DEBUGGER_BASE_URL = click.option( + "--debugger-base-url", + type=str, + help="URL used by the debugger to access LangGraph API. Defaults to http://127.0.0.1:[PORT]", +) + OPT_POSTGRES_URI = click.option( "--postgres-uri", help="Postgres URI to use for the database. Defaults to launching a local database", @@ -152,6 +158,7 @@ def cli(): @OPT_CONFIG @OPT_VERBOSE @OPT_DEBUGGER_PORT +@OPT_DEBUGGER_BASE_URL @OPT_WATCH @OPT_POSTGRES_URI @click.option( @@ -173,6 +180,7 @@ def up( wait: bool, verbose: bool, debugger_port: Optional[int], + debugger_base_url: Optional[str], postgres_uri: Optional[str], ): click.secho("Starting LangGraph API server...", fg="green") @@ -193,6 +201,7 @@ For production use, requires a license key in env var LANGGRAPH_CLOUD_LICENSE_KE watch=watch, verbose=verbose, debugger_port=debugger_port, + debugger_base_url=debugger_base_url, postgres_uri=postgres_uri, ) # add up + options @@ -221,12 +230,15 @@ For production use, requires a license key in env var LANGGRAPH_CLOUD_LICENSE_KE if debugger_port else "https://smith.langchain.com" ) + debugger_base_url_query = ( + debugger_base_url or f"http://127.0.0.1:{port}" + ) set("") sys.stdout.write( f"""Ready! - API: http://localhost:{port} - Docs: http://localhost:{port}/docs -- Debugger: {debugger_origin}/studio/?baseUrl=http://127.0.0.1:{port} +- Debugger: {debugger_origin}/studio/?baseUrl={debugger_base_url_query} """ ) sys.stdout.flush() @@ -449,6 +461,7 @@ def prepare_args_and_stdin( port: int, watch: bool, debugger_port: Optional[int] = None, + debugger_base_url: Optional[str] = None, postgres_uri: Optional[str] = None, ): # prepare args @@ -456,6 +469,7 @@ def prepare_args_and_stdin( capabilities, port=port, debugger_port=debugger_port, + debugger_base_url=debugger_base_url, postgres_uri=postgres_uri, ) args = [ @@ -487,6 +501,7 @@ def prepare( watch: bool, verbose: bool, debugger_port: Optional[int] = None, + debugger_base_url: Optional[str] = None, postgres_uri: Optional[str] = None, ): with open(config_path) as f: @@ -510,6 +525,7 @@ def prepare( port=port, watch=watch, debugger_port=debugger_port, + debugger_base_url=debugger_base_url or f"http://127.0.0.1:{port}", postgres_uri=postgres_uri, ) return args, stdin diff --git a/libs/cli/langgraph_cli/docker.py b/libs/cli/langgraph_cli/docker.py index 1ea991a22..79e0dd25a 100644 --- a/libs/cli/langgraph_cli/docker.py +++ b/libs/cli/langgraph_cli/docker.py @@ -32,18 +32,6 @@ DB = """ """ -DEBUGGER = """ - langgraph-debugger: - image: langchain/langgraph-debugger - restart: on-failure - ports: - - "{debugger_port}:3968" - depends_on: - langgraph-postgres: - condition: service_healthy -""" - - class Version(NamedTuple): major: int minor: int @@ -117,11 +105,38 @@ def check_capabilities(runner) -> DockerCapabilities: ) +def debugger_compose( + *, port: Optional[int] = None, base_url: Optional[str] = None +) -> str: + if port is None: + return "" + + compose_str = """ + langgraph-debugger: + image: langchain/langgraph-debugger + restart: on-failure + depends_on: + langgraph-postgres: + condition: service_healthy + ports: + - "{port}:3968" +""" + + if base_url: + compose_str += """ + environment: + VITE_STUDIO_LOCAL_GRAPH_URL: {base_url} +""" + + return compose_str.format(port=port, base_url=base_url) + + def compose( capabilities: DockerCapabilities, *, port: int, debugger_port: Optional[int] = None, + debugger_base_url: Optional[str] = None, # postgres://user:password@host:port/database?option=value postgres_uri: Optional[str] = None, ) -> str: @@ -151,7 +166,7 @@ def compose( compose_str = f"""{volumes}services: {db} -{DEBUGGER.format(debugger_port=debugger_port) if debugger_port else ""} +{debugger_compose(port=debugger_port, base_url=debugger_base_url)} langgraph-api: ports: - "{port}:8000\"""" diff --git a/libs/cli/tests/unit_tests/test_cli.py b/libs/cli/tests/unit_tests/test_cli.py index 3e54223be..4e9d5746e 100644 --- a/libs/cli/tests/unit_tests/test_cli.py +++ b/libs/cli/tests/unit_tests/test_cli.py @@ -20,6 +20,7 @@ def test_prepare_args_and_stdin(): ) port = 8000 debugger_port = 8001 + debugger_graph_url = f"http://127.0.0.1:{port}" actual_args, actual_stdin = prepare_args_and_stdin( capabilities=DEFAULT_DOCKER_CAPABILITIES, @@ -28,6 +29,7 @@ def test_prepare_args_and_stdin(): docker_compose="custom-docker-compose.yml", port=port, debugger_port=debugger_port, + debugger_base_url=debugger_graph_url, watch=True, ) @@ -63,11 +65,13 @@ services: langgraph-debugger: image: langchain/langgraph-debugger restart: on-failure - ports: - - "{debugger_port}:3968" depends_on: langgraph-postgres: condition: service_healthy + ports: + - "{debugger_port}:3968" + environment: + VITE_STUDIO_LOCAL_GRAPH_URL: {debugger_graph_url} langgraph-api: ports: - "8000:8000"