Files and repositories

Give each turn source repositories and attached input files, then download its artifacts.

Repositories

Pass up to 32 repositories in repos:

{
  "repos": [
    {
      "url": "https://github.com/acme/backend",
      "branch": "main",
      "token": "github_pat_..."
    },
    {
      "url": "https://github.com/acme/public-docs"
    }
  ]
}
FieldRequiredDescription
urlyesHTTPS or git@host:owner/repo repository URL
branchnoBranch to check out; an empty value uses the repository default
tokennoCredential for a private GitHub, GitLab, or Bitbucket repository

SSH-style URLs are normalized to HTTPS. Token injection is adapted for GitHub, GitLab, and Bitbucket. Public repositories need no token.

Repositories are per-turn values and are accepted when resuming a chat. The repository payload and its tokens live on the queued job for that run rather than being stored on the chat.

Inline input files

Attach base64-encoded bytes:

{
  "input_files": [
    {
      "name": "data.csv",
      "content": "YSxiLGMKMSwyLDMK"
    }
  ]
}

Epho stores the bytes privately and gives the sandbox a temporary download URL.

URL input files

If the file already has an accessible URL, avoid base64 overhead:

{
  "input_files": [
    {
      "name": "spec.pdf",
      "url": "https://files.example.com/spec.pdf?signature=..."
    }
  ]
}

Production URLs must use HTTPS. Each entry must contain exactly one of content or url.

Input limits

  • Maximum 20 files per turn.
  • Maximum 25 MiB for one decoded base64 file.
  • Maximum 50 MiB total decoded base64 content.
  • File names must be valid, unique basenames.
  • URL and base64 inputs may be used together in one request.

The runner downloads every attachment into:

/tmp/inputs/<name>

Epho also prepends the exact file paths to the prompt so the agent knows where to look.

Output artifacts

A completed turn may expose files created by the agent:

{
  "artifacts": [
    {
      "name": "report.csv",
      "size": 1240,
      "url": "https://..."
    }
  ]
}

Artifacts live in private object storage. The returned URL is a short-lived presigned download, normally valid for about ten minutes. Call a response or events read endpoint again to mint fresh URLs.

Internal agent-session snapshots are never exposed as user artifacts.