Skip to main content

Overview

The ResolvedConfig interface represents the fully resolved configuration used at runtime. It’s created by merging user-provided configuration (DocbotUserConfig) with default values. All fields are required and guaranteed to be present.

Import

import type { ResolvedConfig } from "docbot/config"
import { loadConfig } from "docbot/config"

Interface definition

interface ResolvedConfig {
  projectSlug: string
  qdrant: {
    url: string
    manifestPath: string
    collections: { docs: string; code: string }
  }
  models: {
    planning: string
    planningHeavy: string
    prose: string
    fast: string
    nano: string
    context: string
    embedding: string
    embeddingLarge: string
  }
  agents: {
    discoveryBudget: number
  }
  server: {
    port: number
  }
  paths: {
    cacheDir: string
    manifest: string
    docs?: string
    codebase?: string[]
  }
}

Fields

projectSlug
string
required
Sanitized project identifier used for collection naming.Default: Sanitized from package.json name field
qdrant
object
required
Qdrant vector database configuration
models
object
required
Resolved model identifiers for all AI operations
agents
object
required
Agent behavior configuration
server
object
required
Server configuration
paths
object
required
Runtime paths for cache, manifest, and optional user-configured paths

Loading configuration

loadConfig

Loads and resolves configuration from the project:
function loadConfig(options?: LoadConfigOptions): Promise<ResolvedConfig>
import { loadConfig } from "docbot/config"

// Load from current directory
const config = await loadConfig()

// Load from specific directory
const config = await loadConfig({ cwd: "/path/to/project" })

// Access resolved values
console.log(config.projectSlug)
console.log(config.models.planning)
console.log(config.qdrant.collections.code)

Default values

The following constants define the default configuration:

DEFAULT_MODELS

const DEFAULT_MODELS = {
  context: "google/gemini-3-pro-preview",
  embedding: "openai/text-embedding-3-small",
  embeddingLarge: "openai/text-embedding-3-large",
  fast: "openai/gpt-5.2",
  nano: "google/gemini-3-flash",
  planning: "openai/gpt-5.2",
  planningHeavy: "anthropic/claude-opus-4.5",
  prose: "anthropic/claude-sonnet-4.5",
} as const

DEFAULT_AGENTS

const DEFAULT_AGENTS = {
  discoveryBudget: 6,
} as const

DEFAULT_QDRANT_URL

const DEFAULT_QDRANT_URL = "http://127.0.0.1:6333"

DEFAULT_SERVER_PORT

const DEFAULT_SERVER_PORT = 3070

Utility functions

makeCollectionNames

Generates default collection names from a project slug:
function makeCollectionNames(slug: string): {
  code: string
  docs: string
}
import { makeCollectionNames } from "docbot/config"

const collections = makeCollectionNames("my-project")
// {
//   code: "docbot_my-project_code",
//   docs: "docbot_my-project_docs"
// }

sanitizeSlug

Sanitizes a string for use as a project slug:
function sanitizeSlug(name: string): string
Converts to lowercase, replaces non-alphanumeric characters (except hyphens) with hyphens, and removes leading/trailing hyphens.
import { sanitizeSlug } from "docbot/config"

sanitizeSlug("My Project Name!")
// "my-project-name"

sanitizeSlug("@company/package-name")
// "company-package-name"

sanitizeSlug("Test___Project")
// "test-project"

findProjectRoot

Finds the project root directory by searching for package.json:
function findProjectRoot(startDir?: string): string | null
import { findProjectRoot } from "docbot/config"

const root = findProjectRoot()
if (root) {
  console.log("Project root:", root)
}

Usage examples

Accessing configuration in code

import { loadConfig } from "docbot/config"

const config = await loadConfig()

// Use model configuration
const planningModel = config.models.planning

// Access Qdrant settings
const qdrantUrl = config.qdrant.url
const codeCollection = config.qdrant.collections.code

// Check agent settings
const maxIterations = config.agents.discoveryBudget

Custom configuration with overrides

import { loadConfig, DEFAULT_MODELS } from "docbot/config"

const config = await loadConfig()

// Merge with custom overrides
const customConfig = {
  ...config,
  models: {
    ...config.models,
    planning: "openai/gpt-4o",
  },
}

Validating resolved configuration

import type { ResolvedConfig } from "docbot/config"
import { loadConfig } from "docbot/config"

function validateConfig(config: ResolvedConfig): boolean {
  // All fields are guaranteed to exist
  return (
    config.projectSlug.length > 0 &&
    config.qdrant.url.startsWith("http") &&
    config.models.planning.includes("/") &&
    config.agents.discoveryBudget > 0 &&
    config.server.port > 0 &&
    config.server.port <= 65535
  )
}

const config = await loadConfig()
if (validateConfig(config)) {
  console.log("Configuration is valid")
}

Build docs developers (and LLMs) love