{
  "manifest_version": "1.0.0",
  "template": {
    "id": "b3b8e6e0-9d72-4518-9fa9-776417e89cb4",
    "slug": "openhands-deepseek-ai-coding-agent",
    "name": "OpenHands + DeepSeek AI Coding Agent",
    "description": "AI coding agent with DeepSeek, GitHub integration, and persistent workspace",
    "url": "https://railway.com/deploy/openhands-deepseek-ai-coding-agent",
    "upstream": {
      "image": "ghcr.io/railwayapp/function-bun:1.4.0"
    }
  },
  "services": [
    {
      "name": "deepseek-api",
      "source": {
        "image": "ghcr.io/railwayapp/function-bun:1.4.0"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "openhands-deepseek",
      "source": {
        "image": "ghcr.io/openhands/agent-canvas:latest"
      },
      "needs_volume": true,
      "volume_mount_path": "/home/openhands/.openhands",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "DEEPSEEK_API_KEY",
      "service": "deepseek-api",
      "description": "Your DeepSeek API key. Get it from https://platform.deepseek.com",
      "secret": true,
      "strategy": "default",
      "default": "sk-f23ec3ef41984175a5faef184c7f2ad6"
    },
    {
      "key": "RUNTIME",
      "service": "openhands-deepseek",
      "description": "Agent runtime mode (local for Railway)",
      "secret": false,
      "strategy": "default",
      "default": "local"
    },
    {
      "key": "LLM_MODEL",
      "service": "openhands-deepseek",
      "description": "DeepSeek model name (e.g., deepseek-chat)",
      "secret": false,
      "strategy": "default",
      "default": "deepseek-chat"
    },
    {
      "key": "LLM_API_KEY",
      "service": "openhands-deepseek",
      "description": "Your DeepSeek API key from https://platform.deepseek.com",
      "secret": true,
      "strategy": "default",
      "default": "sk-f23ec3ef41984175a5faef184c7f2ad6"
    },
    {
      "key": "GITHUB_TOKEN",
      "service": "openhands-deepseek",
      "description": "GitHub personal access token with repo scope for cloning, branching, and creating PRs",
      "secret": true,
      "strategy": "default",
      "default": "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"
    },
    {
      "key": "LLM_BASE_URL",
      "service": "openhands-deepseek",
      "description": "DeepSeek API base URL",
      "secret": false,
      "strategy": "default",
      "default": "https://api.deepseek.com/v1"
    },
    {
      "key": "BASIC_AUTH_USER",
      "service": "openhands-deepseek",
      "description": "Username for basic auth to protect the web UI",
      "secret": false,
      "strategy": "default",
      "default": "admin"
    },
    {
      "key": "OH_PERSISTENCE_DIR",
      "service": "openhands-deepseek",
      "description": "Workspace persistence directory",
      "secret": false,
      "strategy": "default",
      "default": "~/.openhands"
    },
    {
      "key": "BASIC_AUTH_PASSWORD",
      "service": "openhands-deepseek",
      "description": "Password for basic auth to protect the web UI",
      "secret": true,
      "strategy": "default",
      "default": "rawecwwwE#23"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "openhands-deepseek-ai-coding-agent"
      }
    },
    "cli": "railway deploy --template openhands-deepseek-ai-coding-agent",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "b3b8e6e0-9d72-4518-9fa9-776417e89cb4",
            "serializedConfig": {
              "services": {
                "84052d52-d878-40fa-a4a1-d452e277c8da": {
                  "icon": "https://raw.githubusercontent.com/All-Hands-AI/OpenHands/main/logo.png",
                  "name": "deepseek-api",
                  "deploy": {
                    "startCommand": "./run.sh aW1wb3J0IEhvbm8gZnJvbSAiaG9ubyI7Cgpjb25zdCBhcHAgPSBuZXcgSG9ubygpOwoKY29uc3QgREVFUFNFRUtfQVBJX0tFWSA9IHByb2Nlc3MuZW52LkRFRVBTRUVLX0FQSV9LRVk7CmNvbnN0IERFRVBTRUVLX0FQSV9VUkwgPSAiaHR0cHM6Ly9hcGkuZGVlcHNlZWsuY29tL2NoYXQvY29tcGxldGlvbnMiOwoKYXBwLnBvc3QoIi9jaGF0IiwgYXN5bmMgKGMpID0+IHsKICB0cnkgewogICAgY29uc3QgeyBtZXNzYWdlIH0gPSBhd2FpdCBjLnJlcS5qc29uKCk7CgogICAgaWYgKCFtZXNzYWdlKSB7CiAgICAgIHJldHVybiBjLmpzb24oeyBlcnJvcjogIk1lc3NhZ2UgaXMgcmVxdWlyZWQiIH0sIDQwMCk7CiAgICB9CgogICAgaWYgKCFERUVQU0VFS19BUElfS0VZKSB7CiAgICAgIHJldHVybiBjLmpzb24oeyBlcnJvcjogIkRFRVBTRUVLX0FQSV9LRVkgbm90IGNvbmZpZ3VyZWQiIH0sIDUwMCk7CiAgICB9CgogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChERUVQU0VFS19BUElfVVJMLCB7CiAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7REVFUFNFRUtfQVBJX0tFWX1gLAogICAgICB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgbW9kZWw6ICJkZWVwc2Vlay1jaGF0IiwKICAgICAgICBtZXNzYWdlczogWwogICAgICAgICAgewogICAgICAgICAgICByb2xlOiAidXNlciIsCiAgICAgICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2UsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgdGVtcGVyYXR1cmU6IDAuNywKICAgICAgfSksCiAgICB9KTsKCiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOwogICAgICByZXR1cm4gYy5qc29uKHsgZXJyb3I6IGBEZWVwU2VlayBBUEkgZXJyb3I6ICR7ZXJyb3J9YCB9LCByZXNwb25zZS5zdGF0dXMpOwogICAgfQoKICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICByZXR1cm4gYy5qc29uKHsKICAgICAgc3VjY2VzczogdHJ1ZSwKICAgICAgcmVwbHk6IGRhdGEuY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnQsCiAgICAgIHVzYWdlOiBkYXRhLnVzYWdlLAogICAgfSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHJldHVybiBjLmpzb24oCiAgICAgIHsgZXJyb3I6IGBTZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAiVW5rbm93biJ9YCB9LAogICAgICA1MDAKICAgICk7CiAgfQp9KTsKCmFwcC5nZXQoIi9oZWFsdGgiLCAoYykgPT4gewogIHJldHVybiBjLmpzb24oeyBzdGF0dXM6ICJvayIgfSk7Cn0pOwoKYXBwLmdldCgiLyIsIChjKSA9PiB7CiAgcmV0dXJuIGMuanNvbih7CiAgICBtZXNzYWdlOiAiRGVlcFNlZWsgQVBJIFNlcnZpY2UiLAogICAgZW5kcG9pbnRzOiB7CiAgICAgICJQT1NUIC9jaGF0IjogIlNlbmQgYSBtZXNzYWdlIHRvIERlZXBTZWVrIiwKICAgICAgIkdFVCAvaGVhbHRoIjogIkhlYWx0aCBjaGVjayIsCiAgICB9LAogICAgdXNhZ2U6ICdQT1NUIC9jaGF0IHdpdGggSlNPTiBib2R5OiB7ICJtZXNzYWdlIjogInlvdXIgcXVlc3Rpb24gaGVyZSIgfScsCiAgfSk7Cn0pOwoKZXhwb3J0IGRlZmF1bHQgYXBwOw==",
                    "healthcheckPath": "/"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp/function-bun:1.4.0"
                  },
                  "variables": {
                    "DEEPSEEK_API_KEY": {
                      "isOptional": false,
                      "description": "Your DeepSeek API key. Get it from https://platform.deepseek.com",
                      "defaultValue": "sk-f23ec3ef41984175a5faef184c7f2ad6"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "9b49eb87-7c5a-4b2c-b0dc-91f7870d62e2": {
                  "icon": "https://raw.githubusercontent.com/All-Hands-AI/OpenHands/main/logo.png",
                  "name": "openhands-deepseek",
                  "deploy": {
                    "startCommand": "",
                    "healthcheckPath": "/health",
                    "healthcheckTimeout": 30
                  },
                  "source": {
                    "image": "ghcr.io/openhands/agent-canvas:latest"
                  },
                  "variables": {
                    "RUNTIME": {
                      "isOptional": true,
                      "description": "Agent runtime mode (local for Railway)",
                      "defaultValue": "local"
                    },
                    "LLM_MODEL": {
                      "isOptional": false,
                      "description": "DeepSeek model name (e.g., deepseek-chat)",
                      "defaultValue": "deepseek-chat"
                    },
                    "LLM_API_KEY": {
                      "isOptional": false,
                      "description": "Your DeepSeek API key from https://platform.deepseek.com",
                      "defaultValue": "sk-f23ec3ef41984175a5faef184c7f2ad6"
                    },
                    "GITHUB_TOKEN": {
                      "isOptional": false,
                      "description": "GitHub personal access token with repo scope for cloning, branching, and creating PRs",
                      "defaultValue": "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"
                    },
                    "LLM_BASE_URL": {
                      "isOptional": false,
                      "description": "DeepSeek API base URL",
                      "defaultValue": "https://api.deepseek.com/v1"
                    },
                    "BASIC_AUTH_USER": {
                      "isOptional": false,
                      "description": "Username for basic auth to protect the web UI",
                      "defaultValue": "admin"
                    },
                    "OH_PERSISTENCE_DIR": {
                      "isOptional": true,
                      "description": "Workspace persistence directory",
                      "defaultValue": "~/.openhands"
                    },
                    "BASIC_AUTH_PASSWORD": {
                      "isOptional": false,
                      "description": "Password for basic auth to protect the web UI",
                      "defaultValue": "rawecwwwE#23"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  },
                  "volumeMounts": {
                    "openhands-workspace": {
                      "sizeMB": 5120,
                      "mountPath": "/home/openhands/.openhands"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "deepseek-api",
      "method": "GET",
      "path": "/",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 2,
    "needs_volume": true
  },
  "generated_at": "2026-09-25T16:14:54.488Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-25T13:37:40.078Z",
  "success_rate_30d": 0,
  "validation": {
    "last_run_id": "run_64eccacfdd404f8182ea",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": false,
        "detail": "FAILED,DEPLOYING"
      }
    ]
  }
}
