# SegmindWorkflow

**SegmindWorkflow** is a Python package that provides a structured approach to handling multiple API calls in a sequence. It is designed to query a prompt, manage a function call sequence based on API responses, and execute these functions in a defined order. The package keeps track of the context, cost, and credits left after each function call.

## Installation

To install the `SegmindWorkflow` package, use pip:

```bash
pip install segmindworkflow
```

## Usage

### Import the Package

First, import the `Workflow` class from the `segmindworkflow` package:

```python
from segmindworkflow import Workflow
```

### Initialization

Initialize the `Workflow` class by passing an API key, which will be used for external API requests.

```python
api_key = "your_api_key_here"
workflow = Workflow(api_key)
```

### 1. Query the Workflow

The `query` method allows you to send a prompt to the external API. Based on the prompt, the API will return a sequence of function calls and an updated context for further queries or function executions.

**Parameters:**

- `prompt` (str): The input string (or query) you want to send to the API.

```python
prompt = "Find the best solution for my query"
workflow.query(prompt)
```

This method will update:
- The function call sequence.
- The context for future requests.

### 2. Execute the Function Sequence

Once the function call sequence is generated, you can execute it using the `call` method. This method will go through each function in the sequence and make API requests to execute them in order.

**Parameters:**

- `input_data` (dict): The input data required by the functions in the sequence.

```python
input_data = {
    "param1": "value1",
    "param2": "value2"
}
workflow.call(input_data)
```

### 3. Get the Function Call Sequence

You can retrieve the sequence of function calls generated by the last query using the `get_sequence` method.

```python
sequence = workflow.get_sequence()
print("Function call sequence:", sequence)
```

### 4. Get the Results

After executing the function call sequence, you can retrieve the results using the `get_result` method.

```python
results = workflow.get_result()
print("Results:", results)
```

### 5. Check Remaining Credits

Each function call reduces the available credits. You can check how many credits you have left after making function calls with the `w_of_credits_left` method.

```python
credits_left = workflow.w_of_credits_left()
print("Credits left:", credits_left)
```

### 6. Calculate Total Cost

The `w_of_cost` method calculates the total cost of the function call sequence based on the prices defined for each function.

```python
total_cost = workflow.w_of_cost()
print("Total cost:", total_cost)
```

### 7. Reset the Workflow

If you need to reset the workflow (clear context, query sequence, etc.), you can use the `reset` method. This will reset everything except the credits left.

```python
workflow.reset()
```

### Error Handling

Each method will raise meaningful errors if they are called in the wrong order. For example:
- Calling `get_sequence()` before `query()` will raise an error.
- Calling `get_result()` before `call()` will raise an error.
- You cannot calculate the cost of the function sequence before generating it with a query.

These checks ensure that the workflow is followed properly.

### Example Usage

Here's a complete example that showcases the usage of the `SegmindWorkflow` package:

```python
from segmindworkflow import Workflow

# Step 1: Initialize the workflow with an API key
api_key = "your_api_key"
workflow = Workflow(api_key)

# Step 2: Query the workflow with a prompt
prompt = "Optimize the cost of running my application"
workflow.query(prompt)

# Step 3: Execute the sequence of function calls
input_data = {"param1": "value1"}
workflow.call(input_data)

# Step 4: Retrieve the function call sequence
sequence = workflow.get_sequence()
print("Function Call Sequence:", sequence)

# Step 5: Retrieve the results of the function calls
results = workflow.get_result()
print("Results:", results)

# Step 6: Check remaining credits
credits_left = workflow.w_of_credits_left()
print("Credits left:", credits_left)

# Step 7: Calculate the total cost
total_cost = workflow.w_of_cost()
print("Total cost:", total_cost)

# Step 8: Reset the workflow for a new session
workflow.reset()
```

## License

This project is licensed under the MIT License.

## Contributing

If you want to contribute to this package, feel free to fork the repository and submit a pull request.