{
  "manifest_version": "1.0.0",
  "template": {
    "id": "a86ecf76-1e94-475d-9577-19928615e12a",
    "slug": "langserve-pgvector-rag",
    "name": "LangServe RAG API + pgvector",
    "description": "LangServe RAG API with FastAPI, Postgres, pgvector, and auth.",
    "url": "https://railway.com/deploy/langserve-pgvector-rag",
    "upstream": {
      "image": "python:3.12-slim"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "langserve",
      "source": {
        "image": "python:3.12-slim"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "postgres",
      "source": {
        "image": "pgvector/pgvector:pg17"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "langserve",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "APP_API_KEY",
      "service": "langserve",
      "description": "Provide a value for APP_API_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DATABASE_URL",
      "service": "langserve",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "OPENAI_MODEL",
      "service": "langserve",
      "description": "Provide a value for OPENAI_MODEL.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "OPENAI_API_KEY",
      "service": "langserve",
      "description": "Provide a value for OPENAI_API_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "REQUIRE_API_KEY",
      "service": "langserve",
      "description": "Provide a value for REQUIRE_API_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "EMBEDDING_DIMENSIONS",
      "service": "langserve",
      "description": "Provide a value for EMBEDDING_DIMENSIONS.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "LANGSERVE_COLLECTION",
      "service": "langserve",
      "description": "Provide a value for LANGSERVE_COLLECTION.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "PGVECTOR_CONNECTION_STRING",
      "service": "langserve",
      "description": "Provide a value for PGVECTOR_CONNECTION_STRING.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "PGDATA",
      "service": "postgres",
      "description": "Provide a value for PGDATA.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Provide a value for POSTGRES_DB.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "POSTGRES_USER",
      "service": "postgres",
      "description": "Provide a value for POSTGRES_USER.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "langserve-pgvector-rag"
      }
    },
    "cli": "railway deploy --template langserve-pgvector-rag",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "a86ecf76-1e94-475d-9577-19928615e12a",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "36459811-dc17-4f4e-832a-c1924de9d5bd": {
                  "icon": null,
                  "name": "langserve",
                  "deploy": {
                    "startCommand": "/bin/sh -c 'set -eu; mkdir -p /app; echo aW1wb3J0IGhhc2hsaWIKaW1wb3J0IG1hdGgKaW1wb3J0IG9zCmltcG9ydCB1dWlkCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCmltcG9ydCBwc3ljb3BnCmZyb20gZmFzdGFwaSBpbXBvcnQgRGVwZW5kcywgRmFzdEFQSSwgSGVhZGVyLCBIVFRQRXhjZXB0aW9uCmZyb20gbGFuZ2NoYWluX2NvcmUucnVubmFibGVzIGltcG9ydCBSdW5uYWJsZUxhbWJkYQpmcm9tIGxhbmdzZXJ2ZSBpbXBvcnQgYWRkX3JvdXRlcwpmcm9tIHBzeWNvcGcudHlwZXMuanNvbiBpbXBvcnQgSnNvbmIKZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsLCBGaWVsZAoKCkRBVEFCQVNFX1VSTCA9IG9zLmVudmlyb25bIkRBVEFCQVNFX1VSTCJdCkVNQkVERElOR19ESU1FTlNJT05TID0gaW50KG9zLmdldGVudigiRU1CRURESU5HX0RJTUVOU0lPTlMiLCAiNjQiKSkKQ09MTEVDVElPTiA9IG9zLmdldGVudigiTEFOR1NFUlZFX0NPTExFQ1RJT04iLCAicmFpbHdheV9kb2NzIikKUkVRVUlSRV9BUElfS0VZID0gb3MuZ2V0ZW52KCJSRVFVSVJFX0FQSV9LRVkiLCAidHJ1ZSIpLmxvd2VyKCkgPT0gInRydWUiCkFQUF9BUElfS0VZID0gb3MuZ2V0ZW52KCJBUFBfQVBJX0tFWSIsICIiKQpPUEVOQUlfQVBJX0tFWSA9IG9zLmdldGVudigiT1BFTkFJX0FQSV9LRVkiLCAiIikKT1BFTkFJX01PREVMID0gb3MuZ2V0ZW52KCJPUEVOQUlfTU9ERUwiLCAiZ3B0LTQuMS1taW5pIikKCgpjbGFzcyBJbmdlc3RSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgdGV4dDogc3RyID0gRmllbGQobWluX2xlbmd0aD0xKQogIG1ldGFkYXRhOiBkaWN0W3N0ciwgQW55XSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1kaWN0KQoKCmNsYXNzIFNlYXJjaFJlcXVlc3QoQmFzZU1vZGVsKToKICBxdWVyeTogc3RyID0gRmllbGQobWluX2xlbmd0aD0xKQogIGs6IGludCA9IEZpZWxkKGRlZmF1bHQ9NCwgZ2U9MSwgbGU9MTIpCgoKY2xhc3MgUmFnSW5wdXQoQmFzZU1vZGVsKToKICBxdWVzdGlvbjogc3RyID0gRmllbGQobWluX2xlbmd0aD0xKQogIGs6IGludCA9IEZpZWxkKGRlZmF1bHQ9NCwgZ2U9MSwgbGU9MTIpCgoKY2xhc3MgUmFnT3V0cHV0KEJhc2VNb2RlbCk6CiAgYW5zd2VyOiBzdHIKICB1c2VkX2xsbTogYm9vbAogIGNvbnRleHRzOiBsaXN0W2RpY3Rbc3RyLCBBbnldXQoKCmRlZiByZXF1aXJlX2FwaV9rZXkoYXV0aG9yaXphdGlvbjogc3RyIHwgTm9uZSA9IEhlYWRlcihkZWZhdWx0PU5vbmUpKSAtPiBOb25lOgogIGlmIG5vdCBSRVFVSVJFX0FQSV9LRVk6CiAgICByZXR1cm4KICBpZiBub3QgQVBQX0FQSV9LRVk6CiAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTUwMCwgZGV0YWlsPSJBUFBfQVBJX0tFWSBpcyByZXF1aXJlZCB3aGVuIFJFUVVJUkVfQVBJX0tFWT10cnVlIikKICBpZiBhdXRob3JpemF0aW9uICE9IGYiQmVhcmVyIHtBUFBfQVBJX0tFWX0iOgogICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT00MDEsIGRldGFpbD0iTWlzc2luZyBvciBpbnZhbGlkIGJlYXJlciB0b2tlbiIpCgoKZGVmIGVtYmVkZGluZ19mb3IodGV4dDogc3RyKSAtPiBsaXN0W2Zsb2F0XToKICB2ZWN0b3IgPSBbMC4wXSAqIEVNQkVERElOR19ESU1FTlNJT05TCiAgZm9yIHRva2VuIGluIHRleHQubG93ZXIoKS5zcGxpdCgpOgogICAgZGlnZXN0ID0gaGFzaGxpYi5zaGEyNTYodG9rZW4uZW5jb2RlKCJ1dGYtOCIpKS5kaWdlc3QoKQogICAgaW5kZXggPSBpbnQuZnJvbV9ieXRlcyhkaWdlc3RbOjRdLCAiYmlnIikgJSBFTUJFRERJTkdfRElNRU5TSU9OUwogICAgc2lnbiA9IDEuMCBpZiBkaWdlc3RbNF0gJSAyID09IDAgZWxzZSAtMS4wCiAgICB2ZWN0b3JbaW5kZXhdICs9IHNpZ24KICBub3JtID0gbWF0aC5zcXJ0KHN1bSh2YWx1ZSAqIHZhbHVlIGZvciB2YWx1ZSBpbiB2ZWN0b3IpKSBvciAxLjAKICByZXR1cm4gW3JvdW5kKHZhbHVlIC8gbm9ybSwgNikgZm9yIHZhbHVlIGluIHZlY3Rvcl0KCgpkZWYgdmVjdG9yX2xpdGVyYWwodmFsdWVzOiBsaXN0W2Zsb2F0XSkgLT4gc3RyOgogIHJldHVybiAiWyIgKyAiLCIuam9pbihzdHIodmFsdWUpIGZvciB2YWx1ZSBpbiB2YWx1ZXMpICsgIl0iCgoKZGVmIGNvbm5lY3QoKSAtPiBwc3ljb3BnLkNvbm5lY3Rpb246CiAgcmV0dXJuIHBzeWNvcGcuY29ubmVjdChEQVRBQkFTRV9VUkwpCgoKZGVmIGVuc3VyZV9zY2hlbWEoKSAtPiBOb25lOgogIHdpdGggY29ubmVjdCgpIGFzIGNvbm46CiAgICB3aXRoIGNvbm4uY3Vyc29yKCkgYXMgY3VyOgogICAgICBjdXIuZXhlY3V0ZSgiQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHZlY3RvciIpCiAgICAgIGN1ci5leGVjdXRlKAogICAgICAgIGYiIiIKICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBkb2N1bWVudHMgKAogICAgICAgICAgaWQgdXVpZCBQUklNQVJZIEtFWSwKICAgICAgICAgIGNvbGxlY3Rpb24gdGV4dCBOT1QgTlVMTCwKICAgICAgICAgIGNvbnRlbnQgdGV4dCBOT1QgTlVMTCwKICAgICAgICAgIG1ldGFkYXRhIGpzb25iIE5PVCBOVUxMIERFRkFVTFQgJ3t7fX0nOjpqc29uYiwKICAgICAgICAgIGVtYmVkZGluZyB2ZWN0b3Ioe0VNQkVERElOR19ESU1FTlNJT05TfSkgTk9UIE5VTEwsCiAgICAgICAgICBjcmVhdGVkX2F0IHRpbWVzdGFtcHR6IE5PVCBOVUxMIERFRkFVTFQgbm93KCkKICAgICAgICApCiAgICAgICAgIiIiCiAgICAgICkKICAgICAgY3VyLmV4ZWN1dGUoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGRvY3VtZW50c19jb2xsZWN0aW9uX2lkeCBPTiBkb2N1bWVudHMgKGNvbGxlY3Rpb24pIikKICAgIGNvbm4uY29tbWl0KCkKCgpkZWYgc2VhcmNoX2RvY3VtZW50cyhxdWVyeTogc3RyLCBrOiBpbnQpIC0+IGxpc3RbZGljdFtzdHIsIEFueV1dOgogIGVuc3VyZV9zY2hlbWEoKQogIHF1ZXJ5X3ZlY3RvciA9IHZlY3Rvcl9saXRlcmFsKGVtYmVkZGluZ19mb3IocXVlcnkpKQogIHdpdGggY29ubmVjdCgpIGFzIGNvbm46CiAgICB3aXRoIGNvbm4uY3Vyc29yKCkgYXMgY3VyOgogICAgICBjdXIuZXhlY3V0ZSgKICAgICAgICAiIiIKICAgICAgICBTRUxFQ1QgaWQ6OnRleHQsIGNvbnRlbnQsIG1ldGFkYXRhLCAxIC0gKGVtYmVkZGluZyA8PT4gJXM6OnZlY3RvcikgQVMgc2NvcmUKICAgICAgICBGUk9NIGRvY3VtZW50cwogICAgICAgIFdIRVJFIGNvbGxlY3Rpb24gPSAlcwogICAgICAgIE9SREVSIEJZIGVtYmVkZGluZyA8PT4gJXM6OnZlY3RvcgogICAgICAgIExJTUlUICVzCiAgICAgICAgIiIiLAogICAgICAgIChxdWVyeV92ZWN0b3IsIENPTExFQ1RJT04sIHF1ZXJ5X3ZlY3RvciwgayksCiAgICAgICkKICAgICAgcmV0dXJuIFsKICAgICAgICB7ImlkIjogcm93WzBdLCAidGV4dCI6IHJvd1sxXSwgIm1ldGFkYXRhIjogcm93WzJdLCAic2NvcmUiOiBmbG9hdChyb3dbM10pfQogICAgICAgIGZvciByb3cgaW4gY3VyLmZldGNoYWxsKCkKICAgICAgXQoKCmRlZiBpbmdlc3RfZG9jdW1lbnQocGF5bG9hZDogSW5nZXN0UmVxdWVzdCkgLT4gZGljdFtzdHIsIHN0cl06CiAgZW5zdXJlX3NjaGVtYSgpCiAgZG9jdW1lbnRfaWQgPSB1dWlkLnV1aWQ0KCkKICB3aXRoIGNvbm5lY3QoKSBhcyBjb25uOgogICAgd2l0aCBjb25uLmN1cnNvcigpIGFzIGN1cjoKICAgICAgY3VyLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgSU5TRVJUIElOVE8gZG9jdW1lbnRzIChpZCwgY29sbGVjdGlvbiwgY29udGVudCwgbWV0YWRhdGEsIGVtYmVkZGluZykKICAgICAgICBWQUxVRVMgKCVzLCAlcywgJXMsICVzLCAlczo6dmVjdG9yKQogICAgICAgICIiIiwKICAgICAgICAoCiAgICAgICAgICBkb2N1bWVudF9pZCwKICAgICAgICAgIENPTExFQ1RJT04sCiAgICAgICAgICBwYXlsb2FkLnRleHQsCiAgICAgICAgICBKc29uYihwYXlsb2FkLm1ldGFkYXRhKSwKICAgICAgICAgIHZlY3Rvcl9saXRlcmFsKGVtYmVkZGluZ19mb3IocGF5bG9hZC50ZXh0KSksCiAgICAgICAgKSwKICAgICAgKQogICAgY29ubi5jb21taXQoKQogIHJldHVybiB7ImlkIjogc3RyKGRvY3VtZW50X2lkKX0KCgpkZWYgYW5zd2VyX3F1ZXN0aW9uKHBheWxvYWQ6IFJhZ0lucHV0IHwgZGljdFtzdHIsIEFueV0pIC0+IFJhZ091dHB1dDoKICBpZiBpc2luc3RhbmNlKHBheWxvYWQsIGRpY3QpOgogICAgcGF5bG9hZCA9IFJhZ0lucHV0Lm1vZGVsX3ZhbGlkYXRlKHBheWxvYWQpCgogIGNvbnRleHRzID0gc2VhcmNoX2RvY3VtZW50cyhwYXlsb2FkLnF1ZXN0aW9uLCBwYXlsb2FkLmspCiAgY29udGV4dF90ZXh0ID0gIlxuXG4iLmpvaW4oZiItIHtpdGVtWyd0ZXh0J119IiBmb3IgaXRlbSBpbiBjb250ZXh0cykgb3IgIk5vIG1hdGNoaW5nIGNvbnRleHQgZm91bmQuIgogIHByb21wdCA9ICgKICAgICJBbnN3ZXIgdGhlIHF1ZXN0aW9uIHVzaW5nIG9ubHkgdGhlIHJldHJpZXZlZCBjb250ZXh0LiAiCiAgICAiSWYgdGhlIGNvbnRleHQgaXMgaW5zdWZmaWNpZW50LCBzYXkgd2hhdCBpcyBtaXNzaW5nLlxuXG4iCiAgICBmIlF1ZXN0aW9uOiB7cGF5bG9hZC5xdWVzdGlvbn1cblxuQ29udGV4dDpcbntjb250ZXh0X3RleHR9IgogICkKCiAgaWYgT1BFTkFJX0FQSV9LRVkgYW5kIG5vdCBPUEVOQUlfQVBJX0tFWS5zdGFydHN3aXRoKCJSRVBMQUNFXyIpOgogICAgZnJvbSBsYW5nY2hhaW5fb3BlbmFpIGltcG9ydCBDaGF0T3BlbkFJCgogICAgYW5zd2VyID0gQ2hhdE9wZW5BSShtb2RlbD1PUEVOQUlfTU9ERUwsIHRlbXBlcmF0dXJlPTApLmludm9rZShwcm9tcHQpLmNvbnRlbnQKICAgIHJldHVybiBSYWdPdXRwdXQoYW5zd2VyPWFuc3dlciwgdXNlZF9sbG09VHJ1ZSwgY29udGV4dHM9Y29udGV4dHMpCgogIGFuc3dlciA9ICgKICAgICJPUEVOQUlfQVBJX0tFWSBpcyBub3QgY29uZmlndXJlZCwgc28gdGhpcyBzdGFydGVyIHJldHVybmVkIHJldHJpZXZlZCBjb250ZXh0IG9ubHkuXG5cbiIKICAgIGYie2NvbnRleHRfdGV4dH0iCiAgKQogIHJldHVybiBSYWdPdXRwdXQoYW5zd2VyPWFuc3dlciwgdXNlZF9sbG09RmFsc2UsIGNvbnRleHRzPWNvbnRleHRzKQoKCmFwcCA9IEZhc3RBUEkoCiAgdGl0bGU9IkxhbmdTZXJ2ZSBwZ3ZlY3RvciBSQUcgc3RhcnRlciIsCiAgdmVyc2lvbj0iMS4wLjAiLAogIGRlc2NyaXB0aW9uPSJBIFJhaWx3YXktcmVhZHkgTGFuZ1NlcnZlIHN0YXJ0ZXIgd2l0aCBQb3N0Z3Jlcy9wZ3ZlY3RvciBpbmdlc3Rpb24gYW5kIHJldHJpZXZhbC4iLAopCgoKQGFwcC5vbl9ldmVudCgic3RhcnR1cCIpCmRlZiBzdGFydHVwKCkgLT4gTm9uZToKICBlbnN1cmVfc2NoZW1hKCkKCgpAYXBwLmdldCgiLyIpCmRlZiByb290KCkgLT4gZGljdFtzdHIsIHN0cl06CiAgcmV0dXJuIHsic2VydmljZSI6ICJsYW5nc2VydmUtcGd2ZWN0b3IiLCAiZG9jcyI6ICIvZG9jcyIsICJoZWFsdGgiOiAiL2hlYWx0aCIsICJyYWciOiAiL3JhZy9pbnZva2UifQoKCkBhcHAuZ2V0KCIvaGVhbHRoIikKZGVmIGhlYWx0aCgpIC0+IGRpY3Rbc3RyLCBBbnldOgogIGVuc3VyZV9zY2hlbWEoKQogIHdpdGggY29ubmVjdCgpIGFzIGNvbm46CiAgICB3aXRoIGNvbm4uY3Vyc29yKCkgYXMgY3VyOgogICAgICBjdXIuZXhlY3V0ZSgiU0VMRUNUIGNvdW50KCopIEZST00gZG9jdW1lbnRzIFdIRVJFIGNvbGxlY3Rpb24gPSAlcyIsIChDT0xMRUNUSU9OLCkpCiAgICAgIGNvdW50ID0gY3VyLmZldGNob25lKClbMF0KICByZXR1cm4geyJvayI6IFRydWUsICJjb2xsZWN0aW9uIjogQ09MTEVDVElPTiwgImRvY3VtZW50cyI6IGNvdW50fQoKCkBhcHAucG9zdCgiL2luZ2VzdCIsIGRlcGVuZGVuY2llcz1bRGVwZW5kcyhyZXF1aXJlX2FwaV9rZXkpXSkKZGVmIGluZ2VzdChwYXlsb2FkOiBJbmdlc3RSZXF1ZXN0KSAtPiBkaWN0W3N0ciwgc3RyXToKICByZXR1cm4gaW5nZXN0X2RvY3VtZW50KHBheWxvYWQpCgoKQGFwcC5wb3N0KCIvc2VhcmNoIiwgZGVwZW5kZW5jaWVzPVtEZXBlbmRzKHJlcXVpcmVfYXBpX2tleSldKQpkZWYgc2VhcmNoKHBheWxvYWQ6IFNlYXJjaFJlcXVlc3QpIC0+IGRpY3Rbc3RyLCBBbnldOgogIHJldHVybiB7InJlc3VsdHMiOiBzZWFyY2hfZG9jdW1lbnRzKHBheWxvYWQucXVlcnksIHBheWxvYWQuayl9CgoKcmFnX3J1bm5hYmxlID0gUnVubmFibGVMYW1iZGEoYW5zd2VyX3F1ZXN0aW9uKS53aXRoX3R5cGVzKGlucHV0X3R5cGU9UmFnSW5wdXQsIG91dHB1dF90eXBlPVJhZ091dHB1dCkKYWRkX3JvdXRlcyhhcHAsIHJhZ19ydW5uYWJsZSwgcGF0aD0iL3JhZyIsIGRlcGVuZGVuY2llcz1bRGVwZW5kcyhyZXF1aXJlX2FwaV9rZXkpXSkK | base64 -d > /app/main.py; cd /app; python -m pip install --no-cache-dir fastapi==0.115.14 uvicorn[standard]==0.35.0 langserve==0.3.1 langchain-core==0.3.68 langchain-openai==0.3.27 psycopg[binary]==3.2.9 pgvector==0.4.1 pydantic==2.11.7 sse-starlette==2.4.1; exec python -m uvicorn main:app --host 0.0.0.0 --port \"${PORT:-8000}\"'",
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "python:3.12-slim"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "{{PORT}}"
                    },
                    "APP_API_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{APP_API_KEY}}"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "{{DATABASE_URL}}"
                    },
                    "OPENAI_MODEL": {
                      "isOptional": false,
                      "defaultValue": "{{OPENAI_MODEL}}"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{OPENAI_API_KEY}}"
                    },
                    "REQUIRE_API_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{REQUIRE_API_KEY}}"
                    },
                    "EMBEDDING_DIMENSIONS": {
                      "isOptional": false,
                      "defaultValue": "{{EMBEDDING_DIMENSIONS}}"
                    },
                    "LANGSERVE_COLLECTION": {
                      "isOptional": false,
                      "defaultValue": "{{LANGSERVE_COLLECTION}}"
                    },
                    "PGVECTOR_CONNECTION_STRING": {
                      "isOptional": false,
                      "defaultValue": "{{PGVECTOR_CONNECTION_STRING}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "4f0b13da-3bd8-47bc-a9ec-dde648f40076": {
                  "icon": null,
                  "name": "postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "pgvector/pgvector:pg17"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "defaultValue": "{{PGDATA}}"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "defaultValue": "{{POSTGRES_DB}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "defaultValue": "{{POSTGRES_USER}}"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "4f0b13da-3bd8-47bc-a9ec-dde648f40076": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "langserve",
      "method": "GET",
      "path": "/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 2,
    "needs_volume": true
  },
  "generated_at": "2026-09-22T22:14:50.114Z",
  "generator_version": "0.1.0"
}
