apiVersion: batch/v1
kind: CronJob
metadata:
  name: eval-runner-daily
  labels:
    app: eval-runner
spec:
  schedule: "0 18 * * 2"
  timeZone: "Asia/Shanghai"
  suspend: false
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 1800
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 3
  jobTemplate:
    spec:
      backoffLimit: 1
      ttlSecondsAfterFinished: 86400
      activeDeadlineSeconds: 14400
      parallelism: 1
      completions: 1
      template:
        metadata:
          labels:
            app: eval-runner
        spec:
          serviceAccountName: investibook-eval-runner
          restartPolicy: Never
          affinity:
            podAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchExpressions:
                      - key: app
                        operator: In
                        values:
                          - backend
                  topologyKey: kubernetes.io/hostname
          containers:
            - name: eval-runner
              image: investibook/backend:latest
              imagePullPolicy: IfNotPresent
              command:
                - bash
                - -lc
                - >-
                  cd /app &&
                  uv run python -m investibook.scripts.reconcile_eval_running_state
                  --older-than-minutes 30
                  --apply &&
                  uv run python -m investibook.scripts.eval run
                  --suite core-daily-demo
                  --mode scheduled
                  --execution-mode acp
                  --user-email eval@investibook.local
                  --timeout-s 900
                  --idle-timeout-s 300
                  --registry-root /app/evaluation/regression
              envFrom:
                - configMapRef:
                    name: investibook-backend-config
              env:
                - name: PORT
                  value: "8000"
                - name: HOST
                  value: "0.0.0.0"
                - name: ACP_AGENT_TYPE
                  value: "opencode"
                - name: ACP_AGENT_BIN
                  value: ""
                - name: ACP_MODEL
                  value: "chat/claude-standard/high"
                - name: AGENT_PROVIDER_CONFIG
                  value: "/data/opencode-config/opencode/opencode.jsonc"
                - name: AGENT_MODEL_STANDARD
                  value: "chat/claude-standard/high"
                - name: AGENT_MODEL_PRO
                  value: "chat/claude-pro/high"
                - name: DATA_DIR
                  value: "/data"
                - name: TEMPLATES_DIR
                  value: "/app/templates"
                - name: AGENTS_DIR
                  value: "/opt/agentkit"
                - name: PANEL_DATA_DIR
                  value: "/opt/agentkit/data"
                - name: XDG_DATA_HOME
                  value: "/data/.opencode"
                - name: XDG_CONFIG_HOME
                  value: "/data/opencode-config"
                - name: LARK_BASE_URL
                  valueFrom:
                    configMapKeyRef:
                      name: investibook-backend-config
                      key: LARK_BASE_URL
                      optional: true
                - name: LARK_BOT_NAME
                  valueFrom:
                    configMapKeyRef:
                      name: investibook-backend-config
                      key: LARK_BOT_NAME
                      optional: true
                - name: CHATBOT_SESSION_TIMEOUT_MINUTES
                  valueFrom:
                    configMapKeyRef:
                      name: investibook-backend-config
                      key: CHATBOT_SESSION_TIMEOUT_MINUTES
                      optional: true
                - name: DEVOPS_API_KEY
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: DEVOPS_API_KEY
                - name: AWS_BEARER_TOKEN_BEDROCK
                  valueFrom:
                    secretKeyRef:
                      name: agent-provider-secret
                      key: AWS_BEARER_TOKEN_BEDROCK
                - name: ADMIN_EMAILS
                  value: "chenyiwen@pingcap.com,lingtao.li@pingcap.com,chensiyu@pingcap.com,charles.m@pingcap.com,chenshuning@pingcap.com,xieyujie@pingcap.com,fuchao.lan@pingcap.com,nizheming@pingcap.com,huyibin@pingcap.com,dihong.wang@pingcap.com,xuhuaiyu@pingcap.com,huoyao@pingcap.com"
                - name: AUTH0_DOMAIN
                  valueFrom:
                    secretKeyRef:
                      name: auth0-secret
                      key: AUTH0_DOMAIN
                - name: AUTH0_CLIENT_ID
                  valueFrom:
                    secretKeyRef:
                      name: auth0-secret
                      key: AUTH0_CLIENT_ID
                - name: INVESTIBOOK_JIRA_USERNAME
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: JIRA_USERNAME
                - name: LARK_APP_ID
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: LARK_APP_ID
                - name: LARK_APP_SECRET
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: LARK_APP_SECRET
                - name: LARK_VERIFICATION_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: LARK_VERIFICATION_TOKEN
                - name: LARK_ENCRYPT_KEY
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: LARK_ENCRYPT_KEY
                - name: INVESTIBOOK_JIRA_API_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: JIRA_API_TOKEN
                - name: INVESTIBOOK_CLINIC_API_KEY
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: CLINIC_API_KEY
                - name: INVESTIBOOK_OPENAI_API_KEY
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: OPENAI_API_KEY
                - name: INVESTIBOOK_CALLBACK_API_KEY
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: CALLBACK_API_KEY
                - name: LANGFUSE_PUBLIC_KEY
                  valueFrom:
                    secretKeyRef:
                      name: investibook-langfuse-secret
                      key: LANGFUSE_PUBLIC_KEY
                      optional: true
                - name: LANGFUSE_SECRET_KEY
                  valueFrom:
                    secretKeyRef:
                      name: investibook-langfuse-secret
                      key: LANGFUSE_SECRET_KEY
                      optional: true
                - name: SKILL_CLINIC_API_KEY
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: SKILL_CLINIC_API_KEY
                - name: SKILL_GITHUB_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: investibook-config-secret
                      key: SKILL_GITHUB_TOKEN
              volumeMounts:
                - name: agent-config
                  mountPath: /data/opencode-config/opencode/opencode.jsonc
                  subPath: opencode.jsonc
                  readOnly: true
                - name: data
                  mountPath: /data
              resources:
                requests:
                  cpu: "250m"
                  memory: "1Gi"
                limits:
                  cpu: "2000m"
                  memory: "8Gi"
          volumes:
            - name: agent-config
              configMap:
                name: eval-runner-agent-config
            - name: data
              persistentVolumeClaim:
                claimName: investibook-data
