# Changelog - Jan 20, 2026

**Documentation:** https://docs.composio.dev/docs/changelog/2026/01/20

## File Upload/Download Fixes for latest tool with anyOf, oneOf, and allOf Schemas

File handling modifiers now properly handle nested anyOf, oneOf, and allOf JSON Schema declarations

# Version Information

## TypeScript/JavaScript

* Package: `@composio/core` and provider packages
* Version: `0.5.3`+

## Python

* Package: `composio` and provider packages
* Version: `0.10.8`+

***

The file handling modifiers now properly handle `file_uploadable` and `file_downloadable` properties nested within `anyOf`, `oneOf`, and `allOf` JSON Schema declarations. Previously, only direct child properties (and partial `allOf` support) were detected for file upload/download transformations.

> We recommend updating to version `0.5.3` (TypeScript) or `0.10.8` (Python) or later to ensure file uploads and downloads work correctly with tools that use union or intersection types in their schemas.

# What Changed

## Before (Bug)

File properties inside `anyOf`, `oneOf`, or `allOf` were not detected:

```typescript
// This schema's file_uploadable was NOT being processed
inputParameters: {
  type: 'object',
  properties: {
    fileInput: {
      anyOf: [

          type: 'string',
          file_uploadable: true  // ❌ Not detected
        },

          type: 'null'

      ]

```

## After (Fixed)

File properties are now correctly detected and processed at any nesting level:

```typescript
// Now properly detected and transformed
inputParameters: {
  type: 'object',
  properties: {
    fileInput: {
      anyOf: [

          type: 'string',
          file_uploadable: true  // ✅ Detected and processed
        },

          type: 'null'

      ]

```

# Affected Scenarios

| Scenario                          | Before       | After   |
| --------------------------------- | ------------ | ------- |
| `file_uploadable` in `anyOf`      | Not detected | ✅ Works |
| `file_uploadable` in `oneOf`      | Not detected | ✅ Works |
| `file_uploadable` in `allOf`      | Not detected | ✅ Works |
| `file_downloadable` in `anyOf`    | Not detected | ✅ Works |
| `file_downloadable` in `oneOf`    | Not detected | ✅ Works |
| `file_downloadable` in `allOf`    | Not detected | ✅ Works |
| Nested objects inside union types | Not detected | ✅ Works |
| Array items with union types      | Not detected | ✅ Works |

# How to Update

## TypeScript/JavaScript

**npm:**

```bash
npm update @composio/core@latest
```

**pnpm:**

```bash
pnpm update @composio/core@latest
```

**yarn:**

```bash
yarn upgrade @composio/core@latest
```

## Python

**pip:**

```bash
pip install --upgrade composio
```

**uv:**

```bash
uv pip install --upgrade composio
```

**poetry:**

```bash
poetry update composio
```

# Backward Compatibility

This release is fully backward compatible:

* All existing code continues to work without modifications
* No migration required
* File upload/download for direct properties continues to work as before
* The fix only adds support for previously unsupported schema patterns

# Impact Summary

| Change                             | Runtime Breaking | TypeScript Breaking | Migration Required |
| ---------------------------------- | ---------------- | ------------------- | ------------------ |
| `anyOf` support for file uploads   | No               | No                  | No                 |
| `oneOf` support for file uploads   | No               | No                  | No                 |
| `allOf` support for file uploads   | No               | No                  | No                 |
| `anyOf` support for file downloads | No               | No                  | No                 |
| `oneOf` support for file downloads | No               | No                  | No                 |
| `allOf` support for file downloads | No               | No                  | No                 |

---

## File handling in tool execution now uses presigned URLs

Files from tool execution now use presigned URLs with configurable 1-hour default TTL

# Summary

Files involved in tool execution are now shared via presigned URLs with a default TTL (time-to-live) of 1 hour. You can customize the file TTL through your project configuration.

# What changed

When tools return files (images, documents, exports, etc.), these files are now delivered as presigned URLs with a configurable TTL instead of non-expiring URLs. This provides:

* **Automatic cleanup** - Files expire after the configured TTL
* **Configurable retention** - Adjust file availability based on your application's needs

# Default behavior

All files returned from tool execution now have a **1 hour TTL** by default. After this period, the presigned URLs expire and files are no longer accessible.

# Configuring file TTL

You can adjust the file TTL to match your application's needs.

## Via Dashboard

1. Navigate to **Project Settings** in your Composio dashboard
2. Find the **File TTL** configuration option
3. Set your desired TTL value

## Via API

Use the [Update Project Config API](https://docs.composio.dev/rest-api/projects/patch-org-project-config) to programmatically configure the file TTL:

```bash
curl -X PATCH "https://backend.composio.dev/api/v3/org/projects/config" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "fileTtl": 3600
  }'
```

# Impact

| Aspect            | Before            | After                             |
| ----------------- | ----------------- | --------------------------------- |
| File delivery     | Non-expiring URLs | Presigned URLs with TTL           |
| Default expiry    | None              | 1 hour                            |
| TTL customization | Not available     | Configurable via project settings |

# Migration

No code changes are required. Your existing integrations will continue to receive file URLs as before, but these URLs will now expire after the configured TTL.

If your application stores or caches file URLs for later use, ensure you handle URL expiration appropriately by either:

* Downloading files before the TTL expires
* Re-executing the tool to obtain fresh URLs when needed
* Increasing the TTL via project settings to match your retention requirements

---