diff --git a/AGENTS.md b/AGENTS.md index 9f086f8..07dc4a3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -386,10 +386,10 @@ Integration tests are in `src/__tests__/integration/` and require a running agen export LLM_API_KEY="your-api-key" export LLM_MODEL="anthropic/claude-sonnet-4-5-20250929" -# Start agent-server in Docker (software-agent-sdk v1.42.1) +# Start agent-server in Docker (software-agent-sdk v1.43.0) docker run -d --name agent-server -p 127.0.0.1:8010:8000 \ -v /tmp/agent-workspace:/workspace \ - ghcr.io/openhands/agent-server:1.42.1-python --host 0.0.0.0 + ghcr.io/openhands/agent-server:1.43.0-python --host 0.0.0.0 # Run integration tests npm run test:integration @@ -418,7 +418,7 @@ Required GitHub secrets: ### CI Image Version -- The integration workflow pins `ghcr.io/openhands/agent-server:1.42.1-python`, which corresponds to the `software-agent-sdk` release `v1.42.1`. +- The integration workflow pins `ghcr.io/openhands/agent-server:1.43.0-python`, which corresponds to the `software-agent-sdk` release `v1.43.0`. - Keep the TypeScript client tests strict against that released server image rather than adding compatibility fallbacks for older prerelease builds. ## Agent Behavior Guidelines diff --git a/README.md b/README.md index a7a5a27..87778ae 100644 --- a/README.md +++ b/README.md @@ -473,14 +473,14 @@ Integration tests require a running agent-server in Docker with a mounted worksp chmod 777 /tmp/agent-workspace ``` -2. Start the agent-server container (software-agent-sdk v1.42.1): +2. Start the agent-server container (software-agent-sdk v1.43.0): ```bash docker run -d \ --name agent-server \ -p 127.0.0.1:8010:8000 \ -v /tmp/agent-workspace:/workspace \ - ghcr.io/openhands/agent-server:1.42.1-python --host 0.0.0.0 + ghcr.io/openhands/agent-server:1.43.0-python --host 0.0.0.0 ``` 3. Wait for the server to be ready: diff --git a/package.json b/package.json index dec5e7a..53b2243 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ } }, "config": { - "agentServerImage": "ghcr.io/openhands/agent-server:1.42.1-python" + "agentServerImage": "ghcr.io/openhands/agent-server:1.43.0-python" }, "scripts": { "build": "tsc && node ./scripts/copy-json-assets.mjs && node ./scripts/rewrite-relative-imports.mjs", diff --git a/src/generated/agent-server-schema.ts b/src/generated/agent-server-schema.ts index 245b1af..1d23a6b 100644 --- a/src/generated/agent-server-schema.ts +++ b/src/generated/agent-server-schema.ts @@ -1,5 +1,5 @@ // Generated file. Do not edit by hand. -// Source: ghcr.io/openhands/agent-server:1.42.1-python +// Source: ghcr.io/openhands/agent-server:1.43.0-python // Regenerate with: npm run generate:agent-server-api // This file is auto-generated by @hey-api/openapi-ts @@ -6258,6 +6258,12 @@ export type LlmInput = { * Retention policy for prompt cache. Only sent for supported models (GPT-5+ and GPT-4.1, excluding Azure deployments); explicitly stripped for all others. */ prompt_cache_retention?: string | null; + /** + * Provider Connection Id + * + * Optional provider connection whose shared API key and base URL are resolved and applied each time this LLM profile is loaded (read-at-use). When set, the profile stores no inline api_key or base_url of its own. + */ + provider_connection_id?: string | null; /** * Reasoning Effort * @@ -6594,6 +6600,12 @@ export type LlmOutput = { * Retention policy for prompt cache. Only sent for supported models (GPT-5+ and GPT-4.1, excluding Azure deployments); explicitly stripped for all others. */ prompt_cache_retention?: string | null; + /** + * Provider Connection Id + * + * Optional provider connection whose shared API key and base URL are resolved and applied each time this LLM profile is loaded (read-at-use). When set, the profile stores no inline api_key or base_url of its own. + */ + provider_connection_id?: string | null; /** * Reasoning Effort * @@ -9399,6 +9411,14 @@ export type ProfileInfo = { * Name */ name: string; + /** + * Provider Connection Broken + */ + provider_connection_broken?: boolean; + /** + * Provider Connection Id + */ + provider_connection_id?: string | null; }; /** @@ -9429,6 +9449,80 @@ export type ProfileMutationResponse = { name: string; }; +/** + * ProviderConnectionCreateRequest + */ +export type ProviderConnectionCreateRequest = { + /** + * Base Url + */ + base_url?: string | null; + /** + * Display Name + */ + display_name: string; + /** + * Provider + */ + provider?: string; +}; + +/** + * ProviderConnectionResponse + */ +export type ProviderConnectionResponse = { + /** + * Api Key Set + */ + api_key_set?: boolean; + /** + * Base Url + */ + base_url?: string | null; + /** + * Created At + */ + created_at: number; + /** + * Display Name + */ + display_name: string; + /** + * Id + */ + id: string; + /** + * Provider + */ + provider: string; + /** + * Updated At + */ + updated_at: number; +}; + +/** + * ProviderConnectionUpdateRequest + */ +export type ProviderConnectionUpdateRequest = { + /** + * Api Key + */ + api_key?: null; + /** + * Base Url + */ + base_url?: string | null; + /** + * Display Name + */ + display_name?: string | null; + /** + * Provider + */ + provider?: string | null; +}; + /** * ProvidersResponse * @@ -10658,11 +10752,17 @@ export type SkillsResponse = { * * Payload to create a new conversation. * - * Supports any concrete :class:`AgentBase` implementation, including regular - * OpenHands agents and ACP agents. Clients may provide either a concrete - * ``agent`` payload or an ``agent_settings`` payload; when ``agent_settings`` - * is provided without ``agent``, the settings are validated with the - * ``agent_kind`` discriminator and converted to the appropriate agent type. + * Extends :class:`ConversationConfig` with the agent specification. Supports + * any concrete :class:`AgentBase` implementation, including regular OpenHands + * agents and ACP agents. Clients may provide either a concrete ``agent`` + * payload or an ``agent_settings`` payload; when ``agent_settings`` is provided + * without ``agent``, the settings are validated with the ``agent_kind`` + * discriminator and converted to the appropriate agent type. + * + * Note: the agent lives here on the *request*, deliberately not on + * ``ConversationConfig``. The persisted record (``StoredConversation``) does + * not carry the agent — its single source of truth is ``ConversationState`` / + * ``base_state.json``. */ export type StartConversationRequest = { agent?: AgentBaseInput; @@ -11713,13 +11813,18 @@ export type TaskTrigger = { * * Deployment-supplied product-analytics transport settings. * - * This carries *transport* only. Whether telemetry may be delivered is - * resolved from consent (``misc_settings.telemetry.consent``, optionally - * seeded or overridden by ``OH_TELEMETRY_CONSENT``) — there is no deployment - * "mode" here, and nothing in the agent-server special-cases a hosted - * deployment. + * This carries transport plus the non-identifying deployment tag. Whether + * telemetry may be delivered is resolved from consent + * (``misc_settings.telemetry.consent``, optionally seeded or overridden by + * ``OH_TELEMETRY_CONSENT``). */ export type TelemetrySpec = { + /** + * Deployment Kind + * + * Deployment kind attached to diagnostic events. Use 'remote' for hosted OpenHands and 'local' for self-hosted or developer runs. + */ + deployment_kind?: 'local' | 'remote'; /** * Event Buffer Size * @@ -12708,6 +12813,47 @@ export type VsCodeUrlResponse = { url: string | null; }; +/** + * ValidateProfileError + * + * Structured error returned when validation fails. + */ +export type ValidateProfileError = { + /** + * Message + */ + message: string; + /** + * Type + */ + type: string; +}; + +/** + * ValidateProfileRequest + * + * Request body for LLM pre-flight validation. + * + * Accepts an LLM config (same shape as ``SaveProfileRequest.llm``) so the + * frontend can validate a draft *before* persisting it. + */ +export type ValidateProfileRequest = { + llm: LlmInput; +}; + +/** + * ValidateProfileResponse + * + * Result of an LLM pre-flight check. + */ +export type ValidateProfileResponse = { + error?: ValidateProfileError | null; + /** + * Valid + */ + valid: boolean; +}; + /** * ValidationError */ @@ -16113,6 +16259,12 @@ export type LlmInputWritable = { * Retention policy for prompt cache. Only sent for supported models (GPT-5+ and GPT-4.1, excluding Azure deployments); explicitly stripped for all others. */ prompt_cache_retention?: string | null; + /** + * Provider Connection Id + * + * Optional provider connection whose shared API key and base URL are resolved and applied each time this LLM profile is loaded (read-at-use). When set, the profile stores no inline api_key or base_url of its own. + */ + provider_connection_id?: string | null; /** * Reasoning Effort * @@ -16443,6 +16595,12 @@ export type LlmOutputWritable = { * Retention policy for prompt cache. Only sent for supported models (GPT-5+ and GPT-4.1, excluding Azure deployments); explicitly stripped for all others. */ prompt_cache_retention?: string | null; + /** + * Provider Connection Id + * + * Optional provider connection whose shared API key and base URL are resolved and applied each time this LLM profile is loaded (read-at-use). When set, the profile stores no inline api_key or base_url of its own. + */ + provider_connection_id?: string | null; /** * Reasoning Effort * @@ -17168,6 +17326,50 @@ export type PlanningFileEditorToolWritable = { observation_type?: string | null; }; +/** + * ProviderConnectionCreateRequest + */ +export type ProviderConnectionCreateRequestWritable = { + /** + * Api Key + */ + api_key: string; + /** + * Base Url + */ + base_url?: string | null; + /** + * Display Name + */ + display_name: string; + /** + * Provider + */ + provider?: string; +}; + +/** + * ProviderConnectionUpdateRequest + */ +export type ProviderConnectionUpdateRequestWritable = { + /** + * Api Key + */ + api_key?: string | null; + /** + * Base Url + */ + base_url?: string | null; + /** + * Display Name + */ + display_name?: string | null; + /** + * Provider + */ + provider?: string | null; +}; + /** * ReadFileTool * @@ -17559,11 +17761,17 @@ export type SkillInputWritable = { * * Payload to create a new conversation. * - * Supports any concrete :class:`AgentBase` implementation, including regular - * OpenHands agents and ACP agents. Clients may provide either a concrete - * ``agent`` payload or an ``agent_settings`` payload; when ``agent_settings`` - * is provided without ``agent``, the settings are validated with the - * ``agent_kind`` discriminator and converted to the appropriate agent type. + * Extends :class:`ConversationConfig` with the agent specification. Supports + * any concrete :class:`AgentBase` implementation, including regular OpenHands + * agents and ACP agents. Clients may provide either a concrete ``agent`` + * payload or an ``agent_settings`` payload; when ``agent_settings`` is provided + * without ``agent``, the settings are validated with the ``agent_kind`` + * discriminator and converted to the appropriate agent type. + * + * Note: the agent lives here on the *request*, deliberately not on + * ``ConversationConfig``. The persisted record (``StoredConversation``) does + * not carry the agent — its single source of truth is ``ConversationState`` / + * ``base_state.json``. */ export type StartConversationRequestWritable = { agent?: AgentBaseInputWritable; @@ -18079,13 +18287,18 @@ export type TaskTrackerToolWritable = { * * Deployment-supplied product-analytics transport settings. * - * This carries *transport* only. Whether telemetry may be delivered is - * resolved from consent (``misc_settings.telemetry.consent``, optionally - * seeded or overridden by ``OH_TELEMETRY_CONSENT``) — there is no deployment - * "mode" here, and nothing in the agent-server special-cases a hosted - * deployment. + * This carries transport plus the non-identifying deployment tag. Whether + * telemetry may be delivered is resolved from consent + * (``misc_settings.telemetry.consent``, optionally seeded or overridden by + * ``OH_TELEMETRY_CONSENT``). */ export type TelemetrySpecWritable = { + /** + * Deployment Kind + * + * Deployment kind attached to diagnostic events. Use 'remote' for hosted OpenHands and 'local' for self-hosted or developer runs. + */ + deployment_kind?: 'local' | 'remote'; /** * Event Buffer Size * @@ -18488,6 +18701,18 @@ export type UpdateSecretsRequestWritable = { }; }; +/** + * ValidateProfileRequest + * + * Request body for LLM pre-flight validation. + * + * Accepts an LLM config (same shape as ``SaveProfileRequest.llm``) so the + * frontend can validate a draft *before* persisting it. + */ +export type ValidateProfileRequestWritable = { + llm: LlmInputWritable; +}; + /** * VisionInspectTool * @@ -20524,6 +20749,40 @@ export type ArchiveDirectoryApiFileArchiveGetResponses = { 200: unknown; }; +export type CreateDirectoryApiFileCreateDirectoryPostData = { + body?: never; + path?: never; + query: { + /** + * Path + * + * Absolute directory path to create + */ + path: string; + }; + url: '/api/file/create_directory'; +}; + +export type CreateDirectoryApiFileCreateDirectoryPostErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type CreateDirectoryApiFileCreateDirectoryPostError = + CreateDirectoryApiFileCreateDirectoryPostErrors[keyof CreateDirectoryApiFileCreateDirectoryPostErrors]; + +export type CreateDirectoryApiFileCreateDirectoryPostResponses = { + /** + * Successful Response + */ + 200: Success; +}; + +export type CreateDirectoryApiFileCreateDirectoryPostResponse = + CreateDirectoryApiFileCreateDirectoryPostResponses[keyof CreateDirectoryApiFileCreateDirectoryPostResponses]; + export type DownloadFileQueryApiFileDownloadGetData = { body?: never; path?: never; @@ -20991,6 +21250,116 @@ export type ListVerifiedModelsApiLlmModelsVerifiedGetResponses = { export type ListVerifiedModelsApiLlmModelsVerifiedGetResponse = ListVerifiedModelsApiLlmModelsVerifiedGetResponses[keyof ListVerifiedModelsApiLlmModelsVerifiedGetResponses]; +export type ListProviderConnectionsApiLlmProviderConnectionsGetData = { + body?: never; + path?: never; + query?: never; + url: '/api/llm/provider-connections'; +}; + +export type ListProviderConnectionsApiLlmProviderConnectionsGetResponses = { + /** + * Response List Provider Connections Api Llm Provider Connections Get + * + * Successful Response + */ + 200: Array; +}; + +export type ListProviderConnectionsApiLlmProviderConnectionsGetResponse = + ListProviderConnectionsApiLlmProviderConnectionsGetResponses[keyof ListProviderConnectionsApiLlmProviderConnectionsGetResponses]; + +export type CreateProviderConnectionApiLlmProviderConnectionsPostData = { + body: ProviderConnectionCreateRequestWritable; + path?: never; + query?: never; + url: '/api/llm/provider-connections'; +}; + +export type CreateProviderConnectionApiLlmProviderConnectionsPostErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type CreateProviderConnectionApiLlmProviderConnectionsPostError = + CreateProviderConnectionApiLlmProviderConnectionsPostErrors[keyof CreateProviderConnectionApiLlmProviderConnectionsPostErrors]; + +export type CreateProviderConnectionApiLlmProviderConnectionsPostResponses = { + /** + * Successful Response + */ + 201: ProviderConnectionResponse; +}; + +export type CreateProviderConnectionApiLlmProviderConnectionsPostResponse = + CreateProviderConnectionApiLlmProviderConnectionsPostResponses[keyof CreateProviderConnectionApiLlmProviderConnectionsPostResponses]; + +export type DeleteProviderConnectionApiLlmProviderConnectionsConnectionIdDeleteData = { + body?: never; + path: { + /** + * Connection Id + */ + connection_id: string; + }; + query?: never; + url: '/api/llm/provider-connections/{connection_id}'; +}; + +export type DeleteProviderConnectionApiLlmProviderConnectionsConnectionIdDeleteErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type DeleteProviderConnectionApiLlmProviderConnectionsConnectionIdDeleteError = + DeleteProviderConnectionApiLlmProviderConnectionsConnectionIdDeleteErrors[keyof DeleteProviderConnectionApiLlmProviderConnectionsConnectionIdDeleteErrors]; + +export type DeleteProviderConnectionApiLlmProviderConnectionsConnectionIdDeleteResponses = { + /** + * Successful Response + */ + 200: ProviderConnectionResponse; +}; + +export type DeleteProviderConnectionApiLlmProviderConnectionsConnectionIdDeleteResponse = + DeleteProviderConnectionApiLlmProviderConnectionsConnectionIdDeleteResponses[keyof DeleteProviderConnectionApiLlmProviderConnectionsConnectionIdDeleteResponses]; + +export type UpdateProviderConnectionApiLlmProviderConnectionsConnectionIdPatchData = { + body: ProviderConnectionUpdateRequestWritable; + path: { + /** + * Connection Id + */ + connection_id: string; + }; + query?: never; + url: '/api/llm/provider-connections/{connection_id}'; +}; + +export type UpdateProviderConnectionApiLlmProviderConnectionsConnectionIdPatchErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type UpdateProviderConnectionApiLlmProviderConnectionsConnectionIdPatchError = + UpdateProviderConnectionApiLlmProviderConnectionsConnectionIdPatchErrors[keyof UpdateProviderConnectionApiLlmProviderConnectionsConnectionIdPatchErrors]; + +export type UpdateProviderConnectionApiLlmProviderConnectionsConnectionIdPatchResponses = { + /** + * Successful Response + */ + 200: ProviderConnectionResponse; +}; + +export type UpdateProviderConnectionApiLlmProviderConnectionsConnectionIdPatchResponse = + UpdateProviderConnectionApiLlmProviderConnectionsConnectionIdPatchResponses[keyof UpdateProviderConnectionApiLlmProviderConnectionsConnectionIdPatchResponses]; + export type ListProvidersApiLlmProvidersGetData = { body?: never; path?: never; @@ -21651,6 +22020,38 @@ export type RenameProfileApiProfilesNameRenamePostResponses = { export type RenameProfileApiProfilesNameRenamePostResponse = RenameProfileApiProfilesNameRenamePostResponses[keyof RenameProfileApiProfilesNameRenamePostResponses]; +export type ValidateProfileApiProfilesNameValidatePostData = { + body: ValidateProfileRequestWritable; + path: { + /** + * Name + */ + name: string; + }; + query?: never; + url: '/api/profiles/{name}/validate'; +}; + +export type ValidateProfileApiProfilesNameValidatePostErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type ValidateProfileApiProfilesNameValidatePostError = + ValidateProfileApiProfilesNameValidatePostErrors[keyof ValidateProfileApiProfilesNameValidatePostErrors]; + +export type ValidateProfileApiProfilesNameValidatePostResponses = { + /** + * Successful Response + */ + 200: ValidateProfileResponse; +}; + +export type ValidateProfileApiProfilesNameValidatePostResponse = + ValidateProfileApiProfilesNameValidatePostResponses[keyof ValidateProfileApiProfilesNameValidatePostResponses]; + export type GetSettingsApiSettingsGetData = { body?: never; path?: never;