Skip to content

Project files ​

kol.json ​

The definition of your AI. kol init writes it with a $schema line, so editors check it as you type.

FieldRequiredAllowedDescription
nameyestext, up to 24 charactersWhat people call it. Short: the app shows 16 characters in calls.
kindyescompanion, servicecompanion: people get it and talk to their own copy. service: a public AI with its own Kol ID that anyone can call; you pay for its calls. Fixed after the first push.
taglineyestext, up to 80 charactersOne line for the marketplace card.
descriptiontext, up to 400 charactersA few sentences for its page (optional).
personastringFile with its instructions: who it is, how it talks, what it knows and won't do (20–2000 characters). Default persona.md.
greetingtext, up to 200 charactersFirst words. {owner} = the name of who it talks to. Empty: a default.
iconyessparkles, chatbubbles, restaurant, school, fitness, heart, musical-notes, book, briefcase, leaf, rocket, happy
coloryes#3B5BDB, #E8590C, #2F9E44, #C2255C, #7048E8, #0C8599, #E67700, #495057
voiceyesmarin, cedar, coral, sage, ash, verse, ballad, alloy
price0, 0.99, 1.99, 2.99, 4.99USD a month for a companion; 0 = free. Nobody is charged yet.
answersForOwnerbooleanCompanions only: it may answer calls for its owner when they cannot, and take a message.
requestsobject or nullIt takes requests (orders, bookings) and sends them to you after the caller confirms.

Other files ​

PathWhat it is
persona.mdIts instructions (or the file persona names). 20 to 2,000 characters.
knowledge/*.md, knowledge/*.txtWhat it knows. Each file is one item, titled by its file name. 40,000 characters in total.
knowledge/urls.txtPublic web pages, one per line (# starts a comment). Read when you push.
tests/*.jsonScripted conversations, see below.
.kol/Which AI this folder is on each host, and kol try sessions. Keep it out of git.

Tests ​

Each file in tests/ is one conversation:

json
{
  "name": "orders",
  "as": "owner",
  "turns": [
    {
      "user": "Hi! Can I order a pizza?",
      "expect": {
        "includesAny": [
          "pizza"
        ],
        "maxWords": 60
      }
    },
    {
      "user": "Yes, please send it.",
      "expect": {
        "tool": "send_request"
      }
    }
  ]
}

as is owner (default) or standIn (it answers a call for its owner). Each turn can check:

CheckPasses when
includesAnyThe reply contains at least one of these (any case).
includesAllThe reply contains every one of these.
excludesThe reply contains none of these.
matchesThe reply matches this regular expression (case-insensitive).
toolThe AI used this tool in this turn, e.g. send_request.
noToolThe AI used no tool in this turn.
maxWordsThe reply has at most this many words.

MIT licensed.