# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: Bifrost
spec:
    description: Self-hosted Bifrost AI gateway — OpenAI-compatible API plus dashboard, pinned to v2.0.0, SQLite, no extra services.
    coverImage: https://opengraph.githubassets.com/1/maximhq/bifrost
    icon: https://avatars.githubusercontent.com/maximhq
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Gateway Domain
          description: Domain for the Bifrost dashboard and OpenAI-compatible API.
        - key: OPENAI_API_KEY
          type: STRING
          name: OpenAI API Key (Optional)
          description: Optional. Upstream OpenAI key. Leave blank and add it later in the dashboard.
        - key: ANTHROPIC_API_KEY
          type: STRING
          name: Anthropic API Key (Optional)
          description: Optional. Upstream Anthropic key. Leave blank to skip.
        - key: OPENROUTER_API_KEY
          type: STRING
          name: OpenRouter API Key (Optional)
          description: Optional. Upstream OpenRouter key. Leave blank to skip.
        - key: DEEPSEEK_API_KEY
          type: STRING
          name: DeepSeek API Key (Optional)
          description: Optional. Upstream DeepSeek key. Leave blank to skip.
    tags:
        - Tool
        - AI
        - Gateway
        - LLM
    readme: |-
        # Bifrost

        [Bifrost](https://github.com/maximhq/bifrost) is an open-source AI gateway. This template follows the official [runtime contract](https://docs.getbifrost.ai/deployment-guides/runtime-contract) (image `v2.0.0`): one Go process, SQLite on `/app/data`, dashboard and inference on the same HTTP port.

        The stack:

        - **bifrost** — `maximhq/bifrost:v2.0.0` (API, dashboard, SQLite config store, SQLite logs store)

        No PostgreSQL, Redis, or extra workers. OSS SQLite is single-replica only.

        ## Resource recommendation

        The image is ~87 MB. 0.5–1 vCPU and 512 MB–1 GB RAM is enough for personal or small-team traffic.

        ## Configuration

        The gateway domain is required. Dashboard auth is on from first boot (`admin` / auto-generated password). Find `BIFROST_ADMIN_PASSWORD` and `BIFROST_VIRTUAL_KEY` on the bifrost service env tab.

        Optional upstream keys (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `OPENROUTER_API_KEY`, `DEEPSEEK_API_KEY`) are wired through `config.json` as `env.*` references. Leave them blank and add providers in the dashboard if you prefer. More providers (Gemini, Azure, Bedrock, Groq, Ollama, …) can be added in the UI without redeploying.

        `BIFROST_ENCRYPTION_KEY` is auto-generated and must stay stable across restarts. Changing it makes persisted secrets unreadable.

        ## First login

        Open the gateway domain. Sign in with:

        - username: `admin`
        - password: `BIFROST_ADMIN_PASSWORD` from the env tab

        Then create extra virtual keys, budgets, or providers in the dashboard.

        ## Quick test

        After `/health` returns 200 and at least one upstream key is set:

        ```bash
        curl --fail-with-body --max-time 60 \
          -X POST https://<your-domain>/v1/chat/completions \
          -H "Authorization: Bearer <BIFROST_VIRTUAL_KEY>" \
          -H "Content-Type: application/json" \
          -d '{"model":"openai/gpt-4o-mini","messages":[{"role":"user","content":"Hello"}]}'
        ```

        Admin basic auth also works: `-u admin:<BIFROST_ADMIN_PASSWORD>`.

        Drop-in OpenAI SDK / GapSeek `OPENAI_BASE_URL`:

        ```text
        https://<your-domain>/openai
        ```

        Use `BIFROST_VIRTUAL_KEY` as `OPENAI_API_KEY`. Model ids are `provider/model`, e.g. `openai/gpt-4o-mini`, `anthropic/claude-sonnet-4-5`, `openrouter/deepseek/deepseek-chat`.

        ## What this template includes

        | Need | This template |
        | --- | --- |
        | OpenAI-compatible `/v1` + `/openai` | Included |
        | Built-in dashboard | Included (same domain) |
        | Failover / load balance / virtual keys | Included (configure in UI) |
        | Semantic cache, MCP, extra providers | Add in the dashboard |
        | Multi-replica / HA | Not included; needs Bifrost Enterprise + PostgreSQL |

        Do not expose an unauthenticated gateway. Inference calls require the virtual key (or admin basic auth) unless you turn that off in Security settings.

        ## Versioning

        Image is pinned to `maximhq/bifrost:v2.0.0` by digest (pulled 2026-09-03). Upstream also publishes `:latest`.

        ## Reference

        - Setup: https://docs.getbifrost.ai/quickstart/gateway/setting-up
        - Runtime contract: https://docs.getbifrost.ai/deployment-guides/runtime-contract
        - config.json: https://docs.getbifrost.ai/deployment-guides/config-json
        - GitHub: https://github.com/maximhq/bifrost
        - License: Apache-2.0
    services:
        - name: bifrost
          icon: https://avatars.githubusercontent.com/maximhq
          template: PREBUILT
          spec:
            id: bifrost
            source:
                image: maximhq/bifrost:v2.0.0@sha256:cf71be9fad4e0749b6e26cbb774c687413dad9a0970b83f4e1dadb6f503ea208
            ports:
                - id: web
                  port: 8080
                  type: HTTP
            volumes:
                - id: data
                  dir: /app/data
            instructions:
                - title: Bifrost URL
                  content: ${ZEABUR_WEB_URL}
                - title: Dashboard
                  content: ${ZEABUR_WEB_URL}
                - title: Admin username
                  content: ${BIFROST_ADMIN_USERNAME}
                - title: Admin password
                  content: ${BIFROST_ADMIN_PASSWORD}
                - title: Virtual key (Bearer for /v1)
                  content: ${BIFROST_VIRTUAL_KEY}
                - title: OpenAI-compatible base URL
                  content: ${ZEABUR_WEB_URL}/openai
                - title: Health
                  content: ${ZEABUR_WEB_URL}/health
                - title: Quick chat (curl)
                  content: |-
                    curl --fail-with-body --max-time 60 \
                      -X POST ${ZEABUR_WEB_URL}/v1/chat/completions \
                      -H "Authorization: Bearer ${BIFROST_VIRTUAL_KEY}" \
                      -H "Content-Type: application/json" \
                      -d '{"model":"openai/gpt-4o-mini","messages":[{"role":"user","content":"Hello"}]}'
            env:
                ANTHROPIC_API_KEY:
                    default: ${ANTHROPIC_API_KEY}
                APP_DIR:
                    default: /app/data
                APP_HOST:
                    default: 0.0.0.0
                APP_PORT:
                    default: "8080"
                BIFROST_ADMIN_PASSWORD:
                    default: Bifrost-${PASSWORD}-Aa1!
                    expose: true
                BIFROST_ADMIN_USERNAME:
                    default: admin
                    expose: true
                BIFROST_ENCRYPTION_KEY:
                    default: ${PASSWORD}
                BIFROST_SETUP_TOKEN:
                    default: ${PASSWORD}
                BIFROST_URL:
                    default: ${ZEABUR_WEB_URL}
                    expose: true
                BIFROST_VIRTUAL_KEY:
                    default: vk-${PASSWORD}
                    expose: true
                DEEPSEEK_API_KEY:
                    default: ${DEEPSEEK_API_KEY}
                LOG_LEVEL:
                    default: info
                LOG_STYLE:
                    default: json
                OPENAI_API_KEY:
                    default: ${OPENAI_API_KEY}
                OPENROUTER_API_KEY:
                    default: ${OPENROUTER_API_KEY}
            configs:
                - path: /app/data/config.json
                  template: |-
                    {
                      "$schema": "https://www.getbifrost.ai/schema",
                      "encryption_key": "env.BIFROST_ENCRYPTION_KEY",
                      "setup_token": "env.BIFROST_SETUP_TOKEN",
                      "client": {
                        "drop_excess_requests": false,
                        "enable_logging": true,
                        "enforce_auth_on_inference": true
                      },
                      "governance": {
                        "auth_config": {
                          "is_enabled": true,
                          "admin_username": "env.BIFROST_ADMIN_USERNAME",
                          "admin_password": "env.BIFROST_ADMIN_PASSWORD",
                          "disable_auth_on_inference": false
                        },
                        "virtual_keys": [
                          {
                            "id": "vk-default",
                            "name": "default",
                            "value": "env.BIFROST_VIRTUAL_KEY",
                            "is_active": true,
                            "provider_configs": [
                              {
                                "provider": "openai",
                                "allowed_models": ["*"],
                                "key_ids": ["*"],
                                "weight": 1
                              },
                              {
                                "provider": "anthropic",
                                "allowed_models": ["*"],
                                "key_ids": ["*"],
                                "weight": 1
                              },
                              {
                                "provider": "openrouter",
                                "allowed_models": ["*"],
                                "key_ids": ["*"],
                                "weight": 1
                              },
                              {
                                "provider": "deepseek",
                                "allowed_models": ["*"],
                                "key_ids": ["*"],
                                "weight": 1
                              }
                            ]
                          }
                        ]
                      },
                      "providers": {
                        "openai": {
                          "keys": [
                            {
                              "name": "openai-primary",
                              "value": "env.OPENAI_API_KEY",
                              "models": ["*"],
                              "weight": 1.0
                            }
                          ]
                        },
                        "anthropic": {
                          "keys": [
                            {
                              "name": "anthropic-primary",
                              "value": "env.ANTHROPIC_API_KEY",
                              "models": ["*"],
                              "weight": 1.0
                            }
                          ]
                        },
                        "openrouter": {
                          "keys": [
                            {
                              "name": "openrouter-primary",
                              "value": "env.OPENROUTER_API_KEY",
                              "models": ["*"],
                              "weight": 1.0
                            }
                          ]
                        },
                        "deepseek": {
                          "keys": [
                            {
                              "name": "deepseek-primary",
                              "value": "env.DEEPSEEK_API_KEY",
                              "models": ["*"],
                              "weight": 1.0
                            }
                          ]
                        }
                      },
                      "config_store": {
                        "enabled": true,
                        "type": "sqlite",
                        "config": {
                          "path": "./config.db"
                        }
                      },
                      "logs_store": {
                        "enabled": true,
                        "type": "sqlite",
                        "config": {
                          "path": "./logs.db"
                        }
                      }
                    }
                  permission: null
                  envsubst: false
            healthCheck:
                type: HTTP
                port: web
                http:
                    path: /health
          domainKey: PUBLIC_DOMAIN
localization:
    zh-CN:
        description: 自托管 Bifrost AI 网关 — OpenAI 兼容 API + 控制台，锁定 v2.0.0，SQLite，无额外服务。
        variables:
            - key: PUBLIC_DOMAIN
              type: DOMAIN
              name: 网关域名
              description: Bifrost 控制台和 OpenAI 兼容 API 要绑定的域名。
            - key: OPENAI_API_KEY
              type: STRING
              name: OpenAI API Key（可选）
              description: 可选。上游 OpenAI key。留空可稍后在控制台添加。
            - key: ANTHROPIC_API_KEY
              type: STRING
              name: Anthropic API Key（可选）
              description: 可选。上游 Anthropic key。留空则跳过。
            - key: OPENROUTER_API_KEY
              type: STRING
              name: OpenRouter API Key（可选）
              description: 可选。上游 OpenRouter key。留空则跳过。
            - key: DEEPSEEK_API_KEY
              type: STRING
              name: DeepSeek API Key（可选）
              description: 可选。上游 DeepSeek key。留空则跳过。
        readme: |-
            # Bifrost

            [Bifrost](https://github.com/maximhq/bifrost) 是开源 AI 网关。本模板按官方 [runtime contract](https://docs.getbifrost.ai/deployment-guides/runtime-contract)（镜像 `v2.0.0`）部署：单个 Go 进程、SQLite 落在 `/app/data`，控制台和推理共用同一个 HTTP 端口。

            包含服务：

            - **bifrost** — `maximhq/bifrost:v2.0.0`（API、控制台、SQLite 配置库、SQLite 日志库）

            不需要 PostgreSQL、Redis 或额外 worker。OSS 的 SQLite 只支持单副本。

            ## 资源建议

            镜像约 87 MB。个人或小团队 0.5–1 vCPU、512 MB–1 GB RAM 即可。

            ## 配置

            需要填写网关域名。控制台鉴权开箱即开（用户名 `admin`，密码自动生成）。到 bifrost 服务的 env 里查看 `BIFROST_ADMIN_PASSWORD` 和 `BIFROST_VIRTUAL_KEY`。

            可选上游 key（`OPENAI_API_KEY`、`ANTHROPIC_API_KEY`、`OPENROUTER_API_KEY`、`DEEPSEEK_API_KEY`）通过 `config.json` 的 `env.*` 引用注入。留空也可以，之后在控制台补。Gemini、Azure、Bedrock、Groq、Ollama 等可在 UI 里加，不用重新部署。

            `BIFROST_ENCRYPTION_KEY` 会自动生成，重启后不要改。改了会导致已加密的配置读不出来。

            ## 首次登录

            打开网关域名，使用：

            - 用户名：`admin`
            - 密码：env 里的 `BIFROST_ADMIN_PASSWORD`

            然后可在控制台继续加虚拟 Key、预算或其它供应商。

            ## 快速测试

            `/health` 返回 200，且至少配置了一个上游 key 之后：

            ```bash
            curl --fail-with-body --max-time 60 \
              -X POST https://<your-domain>/v1/chat/completions \
              -H "Authorization: Bearer <BIFROST_VIRTUAL_KEY>" \
              -H "Content-Type: application/json" \
              -d '{"model":"openai/gpt-4o-mini","messages":[{"role":"user","content":"Hello"}]}'
            ```

            管理员 Basic Auth 也可以：`-u admin:<BIFROST_ADMIN_PASSWORD>`。

            对接 OpenAI SDK / GapSeek 的 `OPENAI_BASE_URL`：

            ```text
            https://<your-domain>/openai
            ```

            `OPENAI_API_KEY` 填 `BIFROST_VIRTUAL_KEY`。模型名是 `provider/model`，例如 `openai/gpt-4o-mini`、`anthropic/claude-sonnet-4-5`、`openrouter/deepseek/deepseek-chat`。

            ## 本模板范围

            | 需求 | 本模板 |
            | --- | --- |
            | OpenAI 兼容 `/v1` + `/openai` | 已包含 |
            | 内置控制台 | 已包含（同一域名） |
            | 故障转移 / 负载均衡 / 虚拟 Key | 已包含（在 UI 配置） |
            | 语义缓存、MCP、更多供应商 | 在控制台添加 |
            | 多副本 / HA | 不包含；需要 Bifrost Enterprise + PostgreSQL |

            不要把未鉴权的网关暴露到公网。推理请求默认需要虚拟 Key（或管理员 Basic Auth），除非你在 Security 里关掉 inference 鉴权。

            ## 版本

            镜像按 digest 锁定 `maximhq/bifrost:v2.0.0`（拉取日期 2026-09-03）。

            ## 参考

            - 安装: https://docs.getbifrost.ai/quickstart/gateway/setting-up
            - Runtime contract: https://docs.getbifrost.ai/deployment-guides/runtime-contract
            - config.json: https://docs.getbifrost.ai/deployment-guides/config-json
            - GitHub: https://github.com/maximhq/bifrost
            - License: Apache-2.0
    zh-TW:
        description: 自架 Bifrost AI 閘道 — OpenAI 相容 API + 控制台，鎖定 v2.0.0，SQLite，無額外服務。
        variables:
            - key: PUBLIC_DOMAIN
              type: DOMAIN
              name: 閘道網域
              description: Bifrost 控制台與 OpenAI 相容 API 要綁定的網域。
            - key: OPENAI_API_KEY
              type: STRING
              name: OpenAI API Key（選填）
              description: 選填。上游 OpenAI key。留空可稍後在控制台新增。
            - key: ANTHROPIC_API_KEY
              type: STRING
              name: Anthropic API Key（選填）
              description: 選填。上游 Anthropic key。留空則略過。
            - key: OPENROUTER_API_KEY
              type: STRING
              name: OpenRouter API Key（選填）
              description: 選填。上游 OpenRouter key。留空則略過。
            - key: DEEPSEEK_API_KEY
              type: STRING
              name: DeepSeek API Key（選填）
              description: 選填。上游 DeepSeek key。留空則略過。
        readme: |-
            # Bifrost

            [Bifrost](https://github.com/maximhq/bifrost) 是開源 AI 閘道。本模板依官方 [runtime contract](https://docs.getbifrost.ai/deployment-guides/runtime-contract)（映像 `v2.0.0`）部署：單一 Go 行程、SQLite 落在 `/app/data`，控制台與推論共用同一個 HTTP 連接埠。

            包含服務：

            - **bifrost** — `maximhq/bifrost:v2.0.0`（API、控制台、SQLite 設定庫、SQLite 日誌庫）

            不需要 PostgreSQL、Redis 或額外 worker。OSS 的 SQLite 只支援單一副本。

            ## 資源建議

            映像約 87 MB。個人或小團隊 0.5–1 vCPU、512 MB–1 GB RAM 即可。

            ## 設定

            需要填寫閘道網域。控制台驗證開箱即開（使用者名稱 `admin`，密碼自動產生）。到 bifrost 服務的 env 查看 `BIFROST_ADMIN_PASSWORD` 與 `BIFROST_VIRTUAL_KEY`。

            可選上游 key（`OPENAI_API_KEY`、`ANTHROPIC_API_KEY`、`OPENROUTER_API_KEY`、`DEEPSEEK_API_KEY`）透過 `config.json` 的 `env.*` 引用注入。留空也可以，之後在控制台補。Gemini、Azure、Bedrock、Groq、Ollama 等可在 UI 新增，不必重新部署。

            `BIFROST_ENCRYPTION_KEY` 會自動產生，重啟後不要改。改了會導致已加密的設定讀不出來。

            ## 首次登入

            打開閘道網域，使用：

            - 使用者名稱：`admin`
            - 密碼：env 裡的 `BIFROST_ADMIN_PASSWORD`

            然後可在控制台繼續加虛擬 Key、預算或其他供應商。

            ## 快速測試

            `/health` 回傳 200，且至少設定了一個上游 key 之後：

            ```bash
            curl --fail-with-body --max-time 60 \
              -X POST https://<your-domain>/v1/chat/completions \
              -H "Authorization: Bearer <BIFROST_VIRTUAL_KEY>" \
              -H "Content-Type: application/json" \
              -d '{"model":"openai/gpt-4o-mini","messages":[{"role":"user","content":"Hello"}]}'
            ```

            管理員 Basic Auth 也可以：`-u admin:<BIFROST_ADMIN_PASSWORD>`。

            對接 OpenAI SDK / GapSeek 的 `OPENAI_BASE_URL`：

            ```text
            https://<your-domain>/openai
            ```

            `OPENAI_API_KEY` 填 `BIFROST_VIRTUAL_KEY`。模型名稱是 `provider/model`，例如 `openai/gpt-4o-mini`、`anthropic/claude-sonnet-4-5`、`openrouter/deepseek/deepseek-chat`。

            ## 本模板範圍

            | 需求 | 本模板 |
            | --- | --- |
            | OpenAI 相容 `/v1` + `/openai` | 已包含 |
            | 內建控制台 | 已包含（同一網域） |
            | 故障轉移 / 負載平衡 / 虛擬 Key | 已包含（在 UI 設定） |
            | 語意快取、MCP、更多供應商 | 在控制台新增 |
            | 多副本 / HA | 不包含；需要 Bifrost Enterprise + PostgreSQL |

            不要把未驗證的閘道暴露到公網。推論請求預設需要虛擬 Key（或管理員 Basic Auth），除非你在 Security 關掉 inference 驗證。

            ## 版本

            映像以 digest 鎖定 `maximhq/bifrost:v2.0.0`（拉取日期 2026-09-03）。

            ## 參考

            - 安裝: https://docs.getbifrost.ai/quickstart/gateway/setting-up
            - Runtime contract: https://docs.getbifrost.ai/deployment-guides/runtime-contract
            - config.json: https://docs.getbifrost.ai/deployment-guides/config-json
            - GitHub: https://github.com/maximhq/bifrost
            - License: Apache-2.0
