> ## Documentation Index
> Fetch the complete documentation index at: https://docs.portkey.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Fine-tune

> Fine-tune your models with Vertex AI

### Upload a file

**REST API**

```sh theme={"system"}
curl -X POST --header 'Authorization: Bearer <portkey_api_key>' \
 --header 'x-portkey-provider: @your-vertex-provider' \
 --header 'x-portkey-vertex-storage-bucket-name: <bucket_name>' \
 --header 'x-portkey-provider-file-name: <file_name>.jsonl' \
 --header 'x-portkey-provider-model: <model_name>' \
 --form 'purpose="fine-tune"' \
 --form 'file=@dataset.jsonl' \
 'https://aigw.portkey.ai/v1/files'
```

**OpenAI Python**

```python theme={"system"}
from openai import OpenAI

openai = OpenAI(
    api_key="PORTKEY_API_KEY",
    base_url="https://aigw.portkey.ai/v1",
    default_headers={"x-portkey-provider": "@VERTEX_PROVIDER", "x-portkey-vertex-storage-bucket-name": "your_bucket_name", "x-portkey-provider-file-name": "your_file_name.jsonl", "x-portkey-provider-model": "gemini-1.5-flash-001"}
)

# Upload a file for fine-tuning
file = openai.files.create(
    file=open("dataset.jsonl", "rb"),
    purpose="fine-tune"
)

print(file)
```

**OpenAI NodeJS**

```typescript theme={"system"}
import OpenAI from 'openai';
import * as fs from 'fs';

const openai = new OpenAI({
    apiKey: "PORTKEY_API_KEY",
    baseURL: "https://aigw.portkey.ai/v1",
    defaultHeaders: { "x-portkey-provider": "@VERTEX_PROVIDER", "x-portkey-vertex-storage-bucket-name": "your_bucket_name", "x-portkey-provider-file-name": "your_file_name.jsonl", "x-portkey-provider-model": "gemini-1.5-flash-001" }
});

(async () => {
    // Upload a file for fine-tuning
    const file = await openai.files.create({
        file: fs.createReadStream("dataset.jsonl"),
        purpose: "fine-tune"
    });

    console.log(file);
})();
```

### Create a fine-tuning job

**REST API**

```sh theme={"system"}
curl -X POST --header 'Content-Type: application/json' \
 --header 'Authorization: Bearer <portkey_api_key>' \
 --data \
 $'{"model": "@your-vertex-provider/<base_model>", "suffix": "<finetune_name>", "training_file": "gs://<bucket_name>/<file_name>.jsonl", "hyperparameters": {"n_epochs": 2}}\n' \
'https://aigw.portkey.ai/v1/fine_tuning/jobs'
```

**OpenAI Python**

```python theme={"system"}
from openai import OpenAI

openai = OpenAI(
    api_key="PORTKEY_API_KEY",
    base_url="https://aigw.portkey.ai/v1"
)

# Create a fine-tuning job
fine_tune_job = openai.fine_tuning.jobs.create(
    model="@VERTEX_PROVIDER/gemini-1.5-pro-002", # Base model to fine-tune
    training_file="<file_id>", # Encoded GCS path to the training file
    suffix="finetune_name", # Custom suffix for the fine-tuned model name
    hyperparameters={
        "n_epochs": 2
    }
)

print(fine_tune_job)
```

**OpenAI NodeJS**

```typescript theme={"system"}
import OpenAI from 'openai';

const openai = new OpenAI({
    apiKey: "PORTKEY_API_KEY",
    baseURL: "https://aigw.portkey.ai/v1"
});

(async () => {
    // Create a fine-tuning job
    const fineTuneJob = await openai.fineTuning.jobs.create({
        model: "@VERTEX_PROVIDER/gemini-1.5-pro-002", // Base model to fine-tune
        training_file: "<file_id>", // Encoded GCS path to the training file
        suffix: "finetune_name", // Custom suffix for the fine-tuned model name
        hyperparameters: {
            n_epochs: 2
        }
    });

    console.log(fineTuneJob);
})();
```

### List fine-tuning jobs

**REST API**

```sh theme={"system"}
curl -X GET --header 'Authorization: Bearer <portkey_api_key>' \
--header 'x-portkey-provider: @your-vertex-provider' \
'https://aigw.portkey.ai/v1/fine_tuning/jobs'
```

**OpenAI Python**

```python theme={"system"}
from openai import OpenAI

openai = OpenAI(
    api_key="PORTKEY_API_KEY",
    base_url="https://aigw.portkey.ai/v1",
    default_headers={"x-portkey-provider": "@VERTEX_PROVIDER"}
)

# List all fine-tuning jobs
jobs = openai.fine_tuning.jobs.list(
    limit=10  # Optional: Number of jobs to retrieve (default: 20)
)

print(jobs)
```

**OpenAI NodeJS**

```typescript theme={"system"}
import OpenAI from 'openai';

const openai = new OpenAI({
    apiKey: "PORTKEY_API_KEY",
    baseURL: "https://aigw.portkey.ai/v1",
    defaultHeaders: { "x-portkey-provider": "@VERTEX_PROVIDER" }
});

(async () => {
    // List all fine-tuning jobs
    const jobs = await openai.fineTuning.jobs.list({
        limit: 10  // Optional: Number of jobs to retrieve (default: 20)
    });

    console.log(jobs);
})();
```

### Get a fine-tuning job

**REST API**

```sh theme={"system"}
curl -X GET --header 'Authorization: Bearer <portkey_api_key>' \
--header 'x-portkey-provider: @your-vertex-provider' \
'https://aigw.portkey.ai/v1/fine_tuning/jobs/<job_id>'
```

**OpenAI Python**

```python theme={"system"}
from openai import OpenAI

openai = OpenAI(
    api_key="PORTKEY_API_KEY",
    base_url="https://aigw.portkey.ai/v1",
    default_headers={"x-portkey-provider": "@VERTEX_PROVIDER"}
)

# Retrieve a specific fine-tuning job
job = openai.fine_tuning.jobs.retrieve(
    "job_id"  // The ID of the fine-tuning job to retrieve
)

print(job)
```

**OpenAI NodeJS**

```typescript theme={"system"}
import OpenAI from 'openai';

const openai = new OpenAI({
    apiKey: "PORTKEY_API_KEY",
    baseURL: "https://aigw.portkey.ai/v1",
    defaultHeaders: { "x-portkey-provider": "@VERTEX_PROVIDER" }
});

(async () => {
    // Retrieve a specific fine-tuning job
    const job = await openai.fineTuning.jobs.retrieve(
        "job_id"  // The ID of the fine-tuning job to retrieve
    );

    console.log(job);
})();
```

### Cancel a fine-tuning job

**REST API**

```sh theme={"system"}
curl -X POST --header 'Authorization: Bearer <portkey_api_key>' \
--header 'x-portkey-provider: @your-vertex-provider' \
'https://aigw.portkey.ai/v1/fine_tuning/jobs/<job_id>/cancel'
```

**OpenAI Python**

```python theme={"system"}
from openai import OpenAI

openai = OpenAI(
    api_key="PORTKEY_API_KEY",
    base_url="https://aigw.portkey.ai/v1",
    default_headers={"x-portkey-provider": "@VERTEX_PROVIDER"}
)

# Cancel a fine-tuning job
cancelled_job = openai.fine_tuning.jobs.cancel(
    "job_id"  // The ID of the fine-tuning job to cancel
)

print(cancelled_job)
```

**OpenAI NodeJS**

```typescript theme={"system"}
import OpenAI from 'openai';

const openai = new OpenAI({
    apiKey: "PORTKEY_API_KEY",
    baseURL: "https://aigw.portkey.ai/v1",
    defaultHeaders: { "x-portkey-provider": "@VERTEX_PROVIDER" }
});

(async () => {
    // Cancel a fine-tuning job
    const cancelledJob = await openai.fineTuning.jobs.cancel(
        "job_id"  // The ID of the fine-tuning job to cancel
    );

    console.log(cancelledJob);
})();
```

Refer to [Google Vertex AI's fine-tuning documentation](https://cloud.google.com/vertex-ai/docs/generative-ai/models/tune-models) for more information on the parameters and options available.


## Related topics

- [Fine-tune](https://docs.portkey.ai/docs/aigw/integrations/llms/fireworks/fine-tuning.md)
- [Data Service](https://docs.portkey.ai/docs/changelog/data-service.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.