---
# System prepended metadata

title: Assistants - peer review

---

---
title: "Assistants"
---

Assistants can use models and tools.
> OpenAI Equivalent: https://platform.openai.com/docs/api-reference/assistants
- Jan's `Assistants` are even more powerful than OpenAI due to customizable code in `index.js`

## User Stories

_Users can download an assistant via a web URL_

- Wireframes here

_Users can import an assistant from local directory_

- Wireframes here

_Users can configure assistant settings_ 

- Wireframes here

## Assistant Object

- `assistant.json`
> OpenAI Equivalen: https://platform.openai.com/docs/api-reference/assistants/object

// KIV 
```shell=
/$JANROOT
    /models
    /assistants  
        /jarvis      # git push http://github.com/abentlen/jarvis
            # TODO: n assistant to multiple assistants
            /threads # Package threads with your Assistant
    /threads
```

- Packaging
    - An Assistant folder

```json
{
  // Jan specific properties
  "avatar": "https://lala.png",
  // TODO: add moar

  // OpenAI compatible properties: https://platform.openai.com/docs/api-reference/assistants
  "id": "asst_abc123",
  "object": "assistant",
  "version": 1,
  "created_at": 1698984975,
  "*name": "Math Tutor",
  "description": null,
  // This one omitted from assistant.json but will be covered in API
"instructions": "", // This is openAI compatible. But it should be passed to model[i] as LLM model
  // "tools": [
  //   {
  //     "type": "retrieval"
  //   },
  //   {
  //     "type": "web_browsing"
  //   }
  // ],
  // "file_ids": [],
  "memory": true; 
        // Persistent Memory (remembers all threads, files)
        // if False, then files, etc are stored at /thread level
  "models": "*",    // Jan - model picker (Default)
  // v2
  // If model is specified, then use the below
  // omitted means default
  "models": [
      { "model_id": "", ..., "parameters": {} }
      // v2 { "model_id": "", ... }
  ],
  // The idea here is for explicitly subscribing to event stream
  // v3 
  "events"*: {
          "model:<>"
          "extension:<>"
      "in": ["assistant:asst_abc123", "jan:*"],
      "out": ["assistant:asst_abc123", "jan:*"]
  }
  // Alternate: Simplified version?
  "events": "*";
  "events": [
      "onMessage",
      "onThread",
      { id: "onMessage", type: "out" } // Event configs
  ]
  // "threads": [<thread_folder_id>]  // Helpful for look up under ~/jan/thread/*
  "metadata": {}
}
```

### Assistant example src/index.ts
```typescript
import {events, models} from "@janhq/core"
import {retrieval} from "@hiro/best-rag-ever" // This can be featured on Jan hub but install from npm

events.on('assistant:asst_abc123', (event) => async {
    const result = models[0].process(event)
    events.emit("assistant:asst_abc123", result)
    resolve()
})
```

### Assistant lifecycle
Assistant has 4 states (enum)
- `to_download`
- `downloading`
- `ready`
- `running`

## Assistants API

- What would modifying Assistant do? (doesn't mutate `index.js`?)
  - By default, `index.js` loads `assistant.json` file and executes exactly like so. This supports builders with little time to write code.
  - The `assistant.json` is 1 source of truth for the definitions of `models` and `built-in tools` that they can use it without writing more code.

### Get list assistants
> OpenAI Equivalent: https://platform.openai.com/docs/api-reference/assistants/listAssistants

### Get assistant
> OpenAI Equivalent: https://platform.openai.com/docs/api-reference/assistants/getAssistant

### Create an assistant
Create an assistant with models and instructions.
> OpenAI Equivalent: https://platform.openai.com/docs/api-reference/assistants/createAssistant

### Modify an assistant
> OpenAI Equivalent: https://platform.openai.com/docs/api-reference/assistants/modifyAssistant

### Delete Assistant
> OpenAI Equivalent: https://platform.openai.com/docs/api-reference/assistants/deleteAssistant

## Assistants Filesystem

```shell
/jan
    /models/
    /threads/
        threads-1/   # jan
        thread-<>/   # chicken
        thread-2/    # multi-assistant (v22)
    /assistants
        /jan
            assistant.json    # Assistant configs (see below)

            # For any custom code
            package.json      # Import npm modules
                              # e.g. Langchain, Llamaindex
            /src              # Supporting files (needs better name)
                index.js      # Entrypoint
                process.js    # For electron IPC processes (needs better name)

            # `/threads` at root level
            # `/models` at root level
        /shakespeare
            assistant.json
            package.json
            /src
                index.js
                process.js
            /threads # if developer specifies
        /chicken
```

### Example
- Jan Assistant json
TBU
- Custom assistant json










## Swagger file

```yaml
AssistantObject:
  type: object
  properties:
    avatar:
      type: string
      description: "URL of the assistant's avatar. Jan-specific property."
      example: "https://lala.png"
    id:
      type: string
      description: "The identifier of the assistant."
      example: "asst_abc123"
    object:
      type: string
      description: "Type of the object, indicating it's an assistant."
      default: "assistant"
    version:
      type: integer
      description: "Version number of the assistant."
      example: 1
    created_at:
      type: integer
      format: int64
      description: "Unix timestamp representing the creation time of the assistant."
    name:
      type: string
      description: "Name of the assistant."
      example: "Math Tutor"
    description:
      type: string
      description: "Description of the assistant. Can be null."
    models:
      type: array
      description: "List of models associated with the assistant. Jan-specific property."
      items:
        type: object
        properties:
          model_id:
            type: string
          # Additional properties for models can be added here
    events:
      type: object
      description: "Event subscription settings for the assistant."
      properties:
        in:
          type: array
          items:
            type: string
        out:
          type: array
          items:
            type: string
      # If there are specific event types, they can be detailed here
    metadata:
      type: object
      description: "Metadata associated with the assistant."
  required:
    - name
    - models
    - events
```