{"record":{"id":"4db147d87ca7df06","repo":"langflow-ai/langflow","slug":"provider-data-must-include-at-least-one-add-flows","errorCode":null,"errorMessage":"provider_data must include at least one add_flows or upsert_tools item for new agent creation.","messagePattern":"provider_data must include at least one add_flows or upsert_tools item for new agent creation\\.","errorType":"validation","errorClass":"ValueError","httpStatus":422,"severity":"error","filePath":"src/backend/base/langflow/api/v1/mappers/deployments/watsonx_orchestrate/payloads.py","lineNumber":390,"sourceCode":"                msg = \"provider_data.existing_agent_id cannot be set to null.\"\n                raise ValueError(msg)\n            if len(self.model_fields_set) > 1:\n                msg = (\n                    \"existing_agent_id is only for tracking existing wxO agents in Langflow and cannot include \"\n                    \"fields that update the wxO agent. Update the deployment after it is tracked.\"\n                )\n                raise ValueError(msg)\n            return self\n        if self.display_name is None:\n            msg = \"provider_data.display_name is required for new agent creation.\"\n            raise ValueError(msg)\n        if self.llm is None:\n            msg = \"provider_data.llm is required for new agent creation.\"\n            raise ValueError(msg)\n        # TODO: Allow wxO agent creation without initial flows/tools once the adapter create path supports it.\n        if not (self.add_flows or self.upsert_tools):\n            msg = \"provider_data must include at least one add_flows or upsert_tools item for new agent creation.\"\n            raise ValueError(msg)\n        _validate_api_unique_connection_app_ids(connections=self.connections)\n        raw_app_ids = {raw.app_id for raw in self.connections}\n        referenced_app_ids = _collect_api_referenced_app_ids(self.add_flows, attr_name=\"app_ids\")\n        referenced_app_ids.update(_collect_api_referenced_app_ids(self.upsert_tools, attr_name=\"add_app_ids\"))\n        _validate_api_unused_raw_app_ids(raw_app_ids=raw_app_ids, referenced_app_ids=referenced_app_ids)\n        return self\n\n    def validate_with_outer_fields(self, outer_payload: DeploymentCreateRequest) -> None:\n        if self.existing_agent_id is None or \"description\" not in outer_payload.model_fields_set:\n            return\n        msg = \"When existing_agent_id is provided, Langflow uses the description already set for the agent in wxO.\"\n        raise ValueError(msg)\n\n\nclass WatsonxApiCreatedTool(BaseModel):\n    \"\"\"API response shape for a tool created from a Langflow flow version.\"\"\"\n\n    model_config = {\"extra\": \"forbid\"}","sourceCodeStart":372,"sourceCodeEnd":408,"githubUrl":"https://github.com/langflow-ai/langflow/blob/976ec789d2886a86de109c044d089d68e96c9a35/src/backend/base/langflow/api/v1/mappers/deployments/watsonx_orchestrate/payloads.py#L372-L408","documentation":"Model validator on WatsonxApiDeploymentCreatePayload: a NEW wxO agent must be created with at least one tool — provider_data must contain at least one add_flows or upsert_tools entry (a TODO notes agent creation without tools is not yet supported by the adapter create path). Empty/omitted both raises ValueError and a 422.","triggerScenarios":"POST /deployments creating a new agent where provider_data has no add_flows and no upsert_tools items.","commonSituations":"Trying to create a bare LLM-only agent first and attach flows later; test payloads with just display_name+llm; UI allowing submit with no flows or tools selected.","solutions":["Include at least one add_flows entry (flow version + app ids) or one upsert_tools entry in the create payload.","If you want an LLM-only agent, track an existing wxO agent via existing_agent_id instead, or create the agent in wxO directly and then track it.","Disable submit in the UI until at least one flow/tool is selected."],"exampleFix":"// before\n{\"provider_data\": {\"display_name\": \"Bot\", \"llm\": \"mistral_large_2\"}}\n// after\n{\"provider_data\": {\"display_name\": \"Bot\", \"llm\": \"mistral_large_2\", \"upsert_tools\": [{\"tool_id\": \"my-tool\", \"add_app_ids\": []}]}}","handlingStrategy":"validation","validationCode":"if provider_data.get(\"existing_agent_id\") is None:\n    assert provider_data.get(\"add_flows\") or provider_data.get(\"upsert_tools\"), \\\n        \"new agent creation requires at least one add_flows or upsert_tools item\"","typeGuard":"const hasInitialTool = (pd: Record<string, unknown>): boolean =>\n  pd.existing_agent_id !== undefined ||\n  (Array.isArray(pd.add_flows) && pd.add_flows.length > 0) ||\n  (Array.isArray(pd.upsert_tools) && pd.upsert_tools.length > 0);","tryCatchPattern":null,"preventionTips":["Disable agent-create submit until one flow or tool is attached.","For LLM-only agents, use existing_agent_id tracking instead of creation.","Watch the mapper TODO — the constraint may relax in later versions; re-read release notes."],"tags":["watsonx-orchestrate","pydantic","validation","http-422","required-field","tools"],"backgroundTag":null,"analyzedSha":"976ec789d2886a86de109c044d089d68e96c9a35","analyzedAt":"2026-08-14T18:23:12.227Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}