diff --git a/enterprise/poetry.lock b/enterprise/poetry.lock index 36c88d6bfd..cb3bfc2c3e 100644 --- a/enterprise/poetry.lock +++ b/enterprise/poetry.lock @@ -5820,13 +5820,15 @@ llama = ["llama-index (>=0.12.29,<0.13.0)", "llama-index-core (>=0.12.29,<0.13.0 [[package]] name = "openhands-agent-server" -version = "1.0.0a5" +version = "1.1.0" description = "OpenHands Agent Server - REST/WebSocket interface for OpenHands AI Agent" optional = false python-versions = ">=3.12" groups = ["main"] -files = [] -develop = false +files = [ + {file = "openhands_agent_server-1.1.0-py3-none-any.whl", hash = "sha256:59a856883df23488c0723e47655ef21649a321fcd4709a25a4690866eff6ac88"}, + {file = "openhands_agent_server-1.1.0.tar.gz", hash = "sha256:e39bebd39afd45cfcfd765005e7c4e5409e46678bd7612ae20bae79f7057b935"}, +] [package.dependencies] aiosqlite = ">=0.19" @@ -5839,16 +5841,9 @@ uvicorn = ">=0.31.1" websockets = ">=12" wsproto = ">=1.2.0" -[package.source] -type = "git" -url = "https://github.com/OpenHands/software-agent-sdk.git" -reference = "d5995c31c55e488d4ab0372d292973bc6fad71f1" -resolved_reference = "d5995c31c55e488d4ab0372d292973bc6fad71f1" -subdirectory = "openhands-agent-server" - [[package]] name = "openhands-ai" -version = "0.0.0-post.5514+7c9e66194" +version = "0.0.0-post.5525+0b6631523" description = "OpenHands: Code Less, Make More" optional = false python-versions = "^3.12,<3.14" @@ -5889,9 +5884,9 @@ memory-profiler = "^0.61.0" numpy = "*" openai = "1.99.9" openhands-aci = "0.3.2" -openhands-agent-server = {git = "https://github.com/OpenHands/software-agent-sdk.git", rev = "d5995c31c55e488d4ab0372d292973bc6fad71f1", subdirectory = "openhands-agent-server"} -openhands-sdk = {git = "https://github.com/OpenHands/software-agent-sdk.git", rev = "d5995c31c55e488d4ab0372d292973bc6fad71f1", subdirectory = "openhands-sdk"} -openhands-tools = {git = "https://github.com/OpenHands/software-agent-sdk.git", rev = "d5995c31c55e488d4ab0372d292973bc6fad71f1", subdirectory = "openhands-tools"} +openhands-agent-server = "1.1.0" +openhands-sdk = "1.1.0" +openhands-tools = "1.1.0" opentelemetry-api = "^1.33.1" opentelemetry-exporter-otlp-proto-grpc = "^1.33.1" pathspec = "^0.12.1" @@ -5947,13 +5942,15 @@ url = ".." [[package]] name = "openhands-sdk" -version = "1.0.0a5" +version = "1.1.0" description = "OpenHands SDK - Core functionality for building AI agents" optional = false python-versions = ">=3.12" groups = ["main"] -files = [] -develop = false +files = [ + {file = "openhands_sdk-1.1.0-py3-none-any.whl", hash = "sha256:4a984ce1687a48cf99a67fdf3d37b116f8b2840743d4807810b5024af6a1d57e"}, + {file = "openhands_sdk-1.1.0.tar.gz", hash = "sha256:855e0d8f3657205e4119e50520c17e65b3358b1a923f7a051a82512a54bf426c"}, +] [package.dependencies] fastmcp = ">=2.11.3" @@ -5969,22 +5966,17 @@ websockets = ">=12" [package.extras] boto3 = ["boto3 (>=1.35.0)"] -[package.source] -type = "git" -url = "https://github.com/OpenHands/software-agent-sdk.git" -reference = "d5995c31c55e488d4ab0372d292973bc6fad71f1" -resolved_reference = "d5995c31c55e488d4ab0372d292973bc6fad71f1" -subdirectory = "openhands-sdk" - [[package]] name = "openhands-tools" -version = "1.0.0a5" +version = "1.1.0" description = "OpenHands Tools - Runtime tools for AI agents" optional = false python-versions = ">=3.12" groups = ["main"] -files = [] -develop = false +files = [ + {file = "openhands_tools-1.1.0-py3-none-any.whl", hash = "sha256:767d6746f05edade49263aa24450a037485a3dc23379f56917ef19aad22033f9"}, + {file = "openhands_tools-1.1.0.tar.gz", hash = "sha256:c2fadaa4f4e16e9a3df5781ea847565dcae7171584f09ef7c0e1d97c8dfc83f6"}, +] [package.dependencies] bashlex = ">=0.18" @@ -5996,13 +5988,6 @@ libtmux = ">=0.46.2" openhands-sdk = "*" pydantic = ">=2.11.7" -[package.source] -type = "git" -url = "https://github.com/OpenHands/software-agent-sdk.git" -reference = "d5995c31c55e488d4ab0372d292973bc6fad71f1" -resolved_reference = "d5995c31c55e488d4ab0372d292973bc6fad71f1" -subdirectory = "openhands-tools" - [[package]] name = "openpyxl" version = "3.1.5" diff --git a/frontend/src/components/v1/chat/event-content-helpers/get-observation-content.ts b/frontend/src/components/v1/chat/event-content-helpers/get-observation-content.ts index 39db76cd2e..ef4ffa253f 100644 --- a/frontend/src/components/v1/chat/event-content-helpers/get-observation-content.ts +++ b/frontend/src/components/v1/chat/event-content-helpers/get-observation-content.ts @@ -49,6 +49,10 @@ const getExecuteBashObservationContent = ( let { output } = observation; + if (!output) { + output = ""; + } + if (output.length > MAX_CONTENT_LENGTH) { output = `${output.slice(0, MAX_CONTENT_LENGTH)}...`; } @@ -136,6 +140,7 @@ const getTaskTrackerObservationContent = ( if ( "content" in observation && observation.content && + typeof observation.content === "string" && observation.content.trim() ) { content += `\n\n**Result:** ${observation.content.trim()}`; diff --git a/frontend/src/hooks/use-terminal.ts b/frontend/src/hooks/use-terminal.ts index a5f6e8286c..b5ffb6baf9 100644 --- a/frontend/src/hooks/use-terminal.ts +++ b/frontend/src/hooks/use-terminal.ts @@ -22,7 +22,7 @@ const renderCommand = ( return; } - const trimmedContent = content.replaceAll("\n", "\r\n").trim(); + const trimmedContent = (content || "").replaceAll("\n", "\r\n").trim(); // Only write if there's actual content to avoid empty newlines if (trimmedContent) { terminal.writeln(parseTerminalOutput(trimmedContent)); diff --git a/openhands/app_server/app_conversation/live_status_app_conversation_service.py b/openhands/app_server/app_conversation/live_status_app_conversation_service.py index 1b2763e279..cc10d254e7 100644 --- a/openhands/app_server/app_conversation/live_status_app_conversation_service.py +++ b/openhands/app_server/app_conversation/live_status_app_conversation_service.py @@ -215,11 +215,12 @@ class LiveStatusAppConversationService(GitAppConversationService): yield task # Start conversation... + body_json = start_conversation_request.model_dump( + mode='json', context={'expose_secrets': True} + ) response = await self.httpx_client.post( f'{agent_server_url}/api/conversations', - json=start_conversation_request.model_dump( - mode='json', context={'expose_secrets': True} - ), + json=body_json, headers={'X-Session-API-Key': sandbox.session_api_key}, timeout=self.sandbox_startup_timeout, ) diff --git a/openhands/app_server/sandbox/sandbox_spec_service.py b/openhands/app_server/sandbox/sandbox_spec_service.py index d079183fbc..fd091ca130 100644 --- a/openhands/app_server/sandbox/sandbox_spec_service.py +++ b/openhands/app_server/sandbox/sandbox_spec_service.py @@ -11,7 +11,7 @@ from openhands.sdk.utils.models import DiscriminatedUnionMixin # The version of the agent server to use for deployments. # Typically this will be the same as the values from the pyproject.toml -AGENT_SERVER_IMAGE = 'ghcr.io/openhands/agent-server:d5995c3-python' +AGENT_SERVER_IMAGE = 'ghcr.io/openhands/agent-server:f3c0c19-python' class SandboxSpecService(ABC): diff --git a/poetry.lock b/poetry.lock index fa2f15ee71..b1d9684299 100644 --- a/poetry.lock +++ b/poetry.lock @@ -7329,14 +7329,14 @@ llama = ["llama-index (>=0.12.29,<0.13.0)", "llama-index-core (>=0.12.29,<0.13.0 [[package]] name = "openhands-agent-server" -version = "1.0.0a6" +version = "1.1.0" description = "OpenHands Agent Server - REST/WebSocket interface for OpenHands AI Agent" optional = false python-versions = ">=3.12" groups = ["main"] files = [ - {file = "openhands_agent_server-1.0.0a6-py3-none-any.whl", hash = "sha256:72b0da038ede018c55c64f0ac99bc5d991af173627efc63de87d54b3cd69134c"}, - {file = "openhands_agent_server-1.0.0a6.tar.gz", hash = "sha256:8c6fbceb07990e3caf7f8797082d1bb614b9f7339bd00576c24fd34a956a03b4"}, + {file = "openhands_agent_server-1.1.0-py3-none-any.whl", hash = "sha256:59a856883df23488c0723e47655ef21649a321fcd4709a25a4690866eff6ac88"}, + {file = "openhands_agent_server-1.1.0.tar.gz", hash = "sha256:e39bebd39afd45cfcfd765005e7c4e5409e46678bd7612ae20bae79f7057b935"}, ] [package.dependencies] @@ -7352,14 +7352,14 @@ wsproto = ">=1.2.0" [[package]] name = "openhands-sdk" -version = "1.0.0a6" +version = "1.1.0" description = "OpenHands SDK - Core functionality for building AI agents" optional = false python-versions = ">=3.12" groups = ["main"] files = [ - {file = "openhands_sdk-1.0.0a6-py3-none-any.whl", hash = "sha256:0b0b579fc48a5b7eaa418ca66188206ba00f4d883997bc29291bc1745e0b7ddc"}, - {file = "openhands_sdk-1.0.0a6.tar.gz", hash = "sha256:01daff435c5f94037b9b4ba85054097ca6235982a9b0fee00341279d4c4b5a01"}, + {file = "openhands_sdk-1.1.0-py3-none-any.whl", hash = "sha256:4a984ce1687a48cf99a67fdf3d37b116f8b2840743d4807810b5024af6a1d57e"}, + {file = "openhands_sdk-1.1.0.tar.gz", hash = "sha256:855e0d8f3657205e4119e50520c17e65b3358b1a923f7a051a82512a54bf426c"}, ] [package.dependencies] @@ -7378,14 +7378,14 @@ boto3 = ["boto3 (>=1.35.0)"] [[package]] name = "openhands-tools" -version = "1.0.0a6" +version = "1.1.0" description = "OpenHands Tools - Runtime tools for AI agents" optional = false python-versions = ">=3.12" groups = ["main"] files = [ - {file = "openhands_tools-1.0.0a6-py3-none-any.whl", hash = "sha256:55b75016f7e3930e4365393a026726eeffae027363d03862a17a8cebc1aed670"}, - {file = "openhands_tools-1.0.0a6.tar.gz", hash = "sha256:4d5382f3e1cab9d23c1ef7ea8e36e821083886d6d4b019100cbf897e3b0cd3be"}, + {file = "openhands_tools-1.1.0-py3-none-any.whl", hash = "sha256:767d6746f05edade49263aa24450a037485a3dc23379f56917ef19aad22033f9"}, + {file = "openhands_tools-1.1.0.tar.gz", hash = "sha256:c2fadaa4f4e16e9a3df5781ea847565dcae7171584f09ef7c0e1d97c8dfc83f6"}, ] [package.dependencies] @@ -16729,4 +16729,4 @@ third-party-runtimes = ["daytona", "e2b-code-interpreter", "modal", "runloop-api [metadata] lock-version = "2.1" python-versions = "^3.12,<3.14" -content-hash = "57ed6b7f4613e668fd1d0e10a21f7c915cdbb9c7b906a0b71a8ba222733c082d" +content-hash = "0fe5bab6aeb5ebce4588b30cfcf491af4cc9d9b9cd5160e67c8a055d9db276fc" diff --git a/pyproject.toml b/pyproject.toml index 6a4ed97cf8..28b7b03f9a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,12 +113,12 @@ e2b-code-interpreter = { version = "^2.0.0", optional = true } pybase62 = "^1.0.0" # V1 dependencies -#openhands-agent-server = { git = "https://github.com/OpenHands/agent-sdk.git", subdirectory = "openhands-agent-server", rev = "be9725b459c0afabc18cfba89acf11dc756b42f0" } -#openhands-sdk = { git = "https://github.com/OpenHands/agent-sdk.git", subdirectory = "openhands-sdk", rev = "be9725b459c0afabc18cfba89acf11dc756b42f0" } -#openhands-tools = { git = "https://github.com/OpenHands/agent-sdk.git", subdirectory = "openhands-tools", rev = "be9725b459c0afabc18cfba89acf11dc756b42f0" } -openhands-sdk = "1.0.0a6" -openhands-agent-server = "1.0.0a6" -openhands-tools = "1.0.0a6" +#openhands-agent-server = { git = "https://github.com/OpenHands/agent-sdk.git", subdirectory = "openhands-agent-server", rev = "f3c0c19cd134fbda84e07f152897a6d61e1e46c5" } +#openhands-sdk = { git = "https://github.com/OpenHands/agent-sdk.git", subdirectory = "openhands-sdk", rev = "f3c0c19cd134fbda84e07f152897a6d61e1e46c5" } +#openhands-tools = { git = "https://github.com/OpenHands/agent-sdk.git", subdirectory = "openhands-tools", rev = "f3c0c19cd134fbda84e07f152897a6d61e1e46c5" } +openhands-sdk = "1.1.0" +openhands-agent-server = "1.1.0" +openhands-tools = "1.1.0" python-jose = { version = ">=3.3", extras = [ "cryptography" ] } sqlalchemy = { extras = [ "asyncio" ], version = "^2.0.40" } pg8000 = "^1.31.5"