Remote Content

Upload content from registered cloud sources via the AgentOS Knowledge API.

Register sources

This configuration fragment assumes existing vector_db and contents_db objects. Start from Manage Knowledge for a complete server, then add the content_sources below to its Knowledge object and register that object with AgentOS. Configure the provider dependencies, read permissions, and credentials described in Cloud Storage Sources. Replace the bucket, repository, and paths with resources you control.

Install requests for the Python client examples. They assume the server is running on port 7777; add authentication headers when required. JSON responses below illustrate shape, not a populated service.

from agno.knowledge.knowledge import Knowledge
from agno.knowledge.remote_content import S3Config, GitHubConfig

knowledge = Knowledge(
    vector_db=vector_db,
    contents_db=contents_db,
    content_sources=[
        S3Config(id="company-s3", name="Company S3", bucket_name="my-bucket"),
        GitHubConfig(id="docs-repo", name="Docs Repo", repo="acme/docs", token="..."),
    ],
)

See Cloud Storage Sources for the provider classes (S3Config, GcsConfig, SharePointConfig, GitHubConfig, AzureBlobConfig) and their parameters.

Once a Knowledge instance has content_sources registered, AgentOS exposes them through the Knowledge API.

# Upload a file from a registered S3 source
curl -X POST http://localhost:7777/knowledge/remote-content \
  -F "config_id=company-s3" \
  -F "path=reports/q4-2025.pdf" \
  -F "name=Q4 Report"

Discover registered sources

The root /knowledge/config endpoint lists every configured remote source under remote_content_sources:

curl http://localhost:7777/knowledge/config | jq '.remote_content_sources'
[
  { "id": "company-s3", "name": "Company S3", "type": "s3", "metadata": null, "prefix": null },
  { "id": "docs-repo",  "name": "Docs Repo",  "type": "github", "metadata": null, "prefix": null }
]

To scope to a specific Knowledge instance, use the per-instance endpoint:

curl http://localhost:7777/knowledge/{knowledge_id}/sources

The id returned here is the value to pass as config_id when uploading.

type valueProvider
s3Amazon S3
gcsGoogle Cloud Storage
sharepointSharePoint
githubGitHub
azureblobAzure Blob Storage

Upload remote content

POST /knowledge/remote-content accepts application/x-www-form-urlencoded and schedules processing as an in-process background task. A 202 acknowledges acceptance, not completed indexing or durable queueing; use the content status endpoints to check completion.

import requests

response = requests.post(
    "http://localhost:7777/knowledge/remote-content",
    data={
        "config_id": "company-s3",
        "path": "reports/q4-2025.pdf",
        "name": "Q4 Report",
        "metadata": '{"team": "finance", "year": 2025}',
    },
)

# 202 Accepted while the content is being processed
print(response.status_code, response.json())

Path semantics

  • A trailing / ingests every file under the prefix as a folder. Example: reports/.
  • No trailing / ingests a single file. Example: reports/q4-2025.pdf.

See the upload-remote-content reference for the full field list.

Per-request overrides with source_params

source_params lets one configured source serve multiple targets. GitHub is the currently supported case: pass repo to point a single GitHubConfig at a different repository per request.

curl -X POST http://localhost:7777/knowledge/remote-content \
  -F "config_id=docs-repo" \
  -F "path=README.md" \
  -F 'source_params={"repo": "acme/other-repo"}'

Without source_params, the request uses the values baked into the registered config.

Browse files in a source

GET /knowledge/{knowledge_id}/sources/{source_id}/files returns paginated files and folder prefixes inside a source.

File listing is currently supported in S3 only.

curl "http://localhost:7777/knowledge/{knowledge_id}/sources/company-s3/files?prefix=reports/&limit=50"
{
  "source_id": "company-s3",
  "source_name": "Company S3",
  "prefix": "reports/",
  "folders": [
    { "prefix": "reports/2025/", "name": "2025", "is_empty": false }
  ],
  "files": [
    {
      "key": "reports/annual-summary.pdf",
      "name": "annual-summary.pdf",
      "size": 102400,
      "last_modified": "2025-01-15T10:30:00Z",
      "content_type": "application/pdf"
    }
  ],
  "meta": { "page": 1, "limit": 50, "total_pages": 1, "total_count": 1 }
}

See the list-files-in-source reference for prefix, limit, page, delimiter, and db_id.

For non-S3 sources, list available content with the provider's own tooling (for example, the GitHub API or the Azure portal) and pass the resulting path directly to POST /knowledge/remote-content.

Next Steps