Skip to content

Server configuration fields ​

For initial setup, run openviking-server init, then run openviking-server doctor after saving the configuration.

The OpenViking server reads ov.conf. The default path is:

text
~/.openviking/ov.conf

Use an environment variable or startup option to select another file:

bash
export OPENVIKING_CONFIG_FILE=/path/to/ov.conf
openviking-server --config /path/to/ov.conf

The server reads the file at startup. Restart the server after changing models, retrieval, storage, or server settings, then run openviking-server doctor.

Studio's Server configuration page offers Save and restart for a single-worker openviking-server process. The existing ROOT-only GET /api/v1/admin/configuration?source=file includes restart capability and instance identity. Only ROOT can request a restart (POST /api/v1/admin/restart, body {"revision":"<saved file revision>"}). The server validates the current file and its revision, returns HTTP 202, drains active requests, stops its managed Bot, then replaces itself using the original interpreter, arguments, environment and working directory. Studio waits for a new service instance before reporting success. Save configuration alone continues to save without restarting.

Multi-worker or embedded ASGI applications report restart as unsupported; restart these through the deployment platform. Startup can still fail because of external dependencies even after schema validation. If the address, port or ROOT credential changes, update Studio's connection settings to reconnect. Account and cluster overrides continue to take precedence over file defaults.

Configurations containing environment references are read-only in the Studio form. Use file mode to edit the original text; quoted/unquoted references, escapes and formatting are saved as submitted. Windows %VAR% references and dollar/percent literals (including \u0024 and \u0025) also use file mode to avoid introducing new references during form serialization.

Configuration Structure ​

This outline shows common top-level groups, not a runnable configuration. For a first deployment, start with the minimal example and supply your models and credentials. Merge later snippets into the same ov.conf.

json
{
  "embedding": {},
  "vlm": {},
  "query_planner": {},
  "rerank": {},
  "rules": {},
  "retrieval": {},
  "storage": {},
  "server": {},
  "memory": {},
  "parsers": {},
  "encryption": {},
  "log": {},
  "telemetry": {}
}

Optional sections use their defaults when omitted. Unknown fields in ov.conf and persisted account settings are ignored for upgrade compatibility, except in the gateway section. Known fields still validate types and values. Misspelled field names are also ignored, but the server logs a warning listing every field it did not apply.

Top-Level Settings ​

SettingType / valuesDefaultPurpose
default_accountstring"default"Default account for the service context
default_userstring"default"Default user for the service context
embeddingobjectbuilt-in local dense modelDense, sparse, and hybrid embedding; defaults to local / bge-small-zh-v1.5-f16
vlmobjectempty configContent understanding, summaries, and memory extraction; configure a working model before using these capabilities
query_plannerobject / nullnullModel for retrieval intent analysis and recall rewriting. Falls back to vlm when omitted or empty; recall rewrite in auto mode requires a configured cluster query_planner or an account-level query_planner or vlm override
rerankobjectdisabledRetrieval result reranking
rulesobjectempty configOptional dedicated models for rule compilation and applicability matching
retrievalobjectsee belowRanking and intent-analysis behavior
grepobjectbuilt-in defaultsText search engine
globobjectbuilt-in defaultsPath glob engine
storageobjectlocalWorkspace, file system, and vector database
queue_workersobjectsee belowRuntime concurrency for QueueFS consumer workers
serverobjectlocal developmentHTTP, authentication, uploads, and observability
memoryobjectsee belowMemory and skill extraction on session commit
parsersobjectparser defaultsPDF, code, image, audio, video, and text parsing
semanticobjectbuilt-in defaultsAbstract and overview generation limits
parser_apiobjectdisabledThird-party file parser API
compile_apiobjectdisabledExternal Compile task API
connectorobjectdisabledExternal Connector ingestion service
encryptionobjectdisabledFile and secret encryption
gitobjectlocalVersion backend: local or s3
logobjectconsoleLog level, format, and file output
telemetryobjectdisabledOpenTelemetry tracing
oauthobjectdisabledMCP OAuth 2.1
gatewayobjectdisabledOpenViking Gateway, the model API gateway that adds OpenViking memory to API-key clients. Unknown keys in this section are errors. See the configuration reference
promptsobjectbuilt-in templatesCustom prompt template directory
ingestobjectbuilt-in defaultsConversation-log ingestion
output_language_overridestring""Force summary/memory language; empty means auto-detect
allow_private_networksbooleanfalseAllow fetching private-network resources

auto_generate_l0, auto_generate_l1, default_search_mode, and default_search_limit are deprecated compatibility fields. They are accepted when loading older configuration files but have no runtime effect.

Model Settings ​

API-based embedding, vlm, query_planner, and rerank configurations reuse some field names, but each module has its own schema. Use only fields supported by the applicable module below.

json
{
  "embedding": {
    "dense": {
      "provider": "volcengine",
      "model": "doubao-embedding-vision-251215",
      "api_base": "https://ark.cn-beijing.volces.com/api/v3",
      "api_key": "<your-ark-api-key>",
      "dimension": 1024,
      "input": "multimodal"
    }
  },
  "vlm": {
    "provider": "volcengine",
    "model": "doubao-seed-2-0-code-preview-260215",
    "api_base": "https://ark.cn-beijing.volces.com/api/v3",
    "api_key": "<your-ark-api-key>",
    "temperature": 0,
    "max_retries": 3,
    "thinking": false
  },
  "query_planner": {
    "provider": "volcengine",
    "model": "doubao-seed-2-0-code-preview-260215",
    "api_base": "https://ark.cn-beijing.volces.com/api/v3",
    "api_key": "<your-ark-api-key>",
    "thinking": false
  },
  "rerank": {
    "provider": "vikingdb",
    "ak": "<your-volcengine-ak>",
    "sk": "<your-volcengine-sk>",
    "host": "api-vikingdb.vikingdb.cn-beijing.volces.com",
    "model_name": "doubao-seed-rerank",
    "model_version": "251028",
    "threshold": 0.1,
    "max_input_tokens": 0
  }
}
Field / pathApplies toPurpose
provider, model, api_base, api_keyEmbedding, VLM, Query Planner, RerankModel service, endpoint, and credential
api_versionEmbedding, VLM, Query PlannerAPI version for providers such as Azure
extra_headersEmbedding, VLM, Query Planner, RerankAdditional request headers
extra_request_bodyVLM, Query PlannerAdditional completion request fields
extra_bodyembedding.dense / sparse / hybridAdditional embedding request fields
timeoutVLM, Query Planner, RerankPer-request timeout in seconds
embedding.max_retries, vlm.max_retries, query_planner.max_retriesEmbedding, VLM, Query PlannerRetry count; Rerank has no max_retries field

embedding.dense ​

FieldType / valuesPurpose
provideropenai, volcengine, azure, ollama, local, etc.Dense embedding service
dimensioninteger, > 0Vector dimension; must match model output and existing collections
input"text" / "multimodal"Input type
encoding_format"float" / "base64"OpenAI-compatible vector encoding

Changing the model or dimension can make existing vector collections incompatible and may require migration or reindexing.

rules ​

Optional models and lifecycle settings for compiled Rules:

json
{
  "rules": {
    "jev_rule_matcher": {
      "provider": "typesafe",
      "api_key": "${JEV_API_KEY}"
    },
    "compiler": {
      "provider": "openai",
      "model": "gpt-4o"
    },
    "compiler_context_window": 0
  }
}
FieldType / valuesDefaultPurpose
jev_rule_matcherJev Noul config / nullnullJev Noul matcher for Scenario filtering and Rule applicability
compilerVLM config / nullnullDedicated Rule compiler
compiler_context_window0 or integer >= 20480Compiler context window; 0 auto-detects with a conservative fallback
scenario_irrelevance_thresholdnumber, 0.5-1.00.9Skip a Scenario only at or above this irrelevance probability
archived_retention_daysinteger, >= 130Days before archived Rules are permanently removed
archived_cleanup_interval_secondsinteger, >= 602592000Archived-Rule cleanup interval
archived_cleanup_enabledbooleantrueEnable periodic archived-Rule cleanup

Rule compilation always calls the dedicated compiler, or the account VLM fallback, with thinking=true, overriding its configured default. Use a model that supports thinking mode, or compilation may fail.

rules.jev_rule_matcher ​

This block configures the independent Jev System One judgments used for Scenario filtering and Rule applicability. It does not configure retrieval reranking.

FieldType / valuesDefaultPurpose
providertypesafe, vercel, openrouter, customtypesafeSelect endpoint and model defaults
api_keystringrequiredAPI key for the selected provider
api_baseURL / nullprovider defaultComplete System One request URL; an explicit value is used unchanged
modelstring / nullprovider defaultModel name or endpoint ID; required for custom
timeoutnumber30HTTP request timeout in seconds
extra_headersobject / nullnullAdditional HTTP request headers
log_payloadsbooleanfalseLog complete requests and responses; these may contain task and Rule content
ProviderDefault request URLDefault modelNotes
typesafehttps://api.typesafe.ai/v1/systemonejev-latestDirect TypeSafe access
vercelhttps://ai-gateway.vercel.sh/typesafe/v1/systemonetypesafe-ai/jevVercel AI Gateway TypeSafe-compatible API
openrouterhttps://openrouter.ai/api/v1/systemonejev-latestOpenRouter System One API
customnonenoneRequires both api_base and model

api_base and model override provider defaults independently. An explicit api_base is the complete POST URL and is never modified, including for custom. extra_headers extends provider headers and can override a provider default. Rule matching always uses independent Noul judgments, so it has no mode, threshold, or max_input_tokens setting. Configure Scenario filtering with rules.scenario_irrelevance_threshold; Rule applicability uses the threshold supplied as rule_probability_threshold in the Rule search request (default 0.65).

Rule status is active, paused, or archived. PAUSE suspends retrieval without expiry; ARCHIVE starts retention from archived_at. RESTORE reactivates a paused Rule. Compilation considers active and paused Rules; archived Rules are logically deleted, are not compiler candidates, and cannot be restored through Rule compilation. ARCHIVE requires explicit deletion, discard, or recycle-bin intent in the user's instruction; non-deletion deactivation requests use PAUSE.

Rules live directly in memories/rules/<scenario_id>/: abstract.md stores Scenario metadata and <atomic_id>.md stores each Rule. See Rules (Beta) for the storage format.

When jev_rule_matcher is unconfigured, unavailable, fails, or returns invalid results, Scenario and Rule judgments pass the candidates without calling a VLM. Scenario diagnostics record decision=pass. Rules return judge=pass, a warning, and score 1.0 to pass the threshold; this score is not a model-estimated applicability probability. Agents still check applicability and exceptions against task facts. Compilation falls back from compiler to the account VLM. The former rule_matcher setting has been removed and is no longer read.

Rule applies_when may be empty and defaults to an empty string. Empty means applicable in every situation unless exception holds. Candidates with neither an applicability condition nor an exception receive probability 1.0 directly. The Compiler prefers faithful, non-empty, decidable conditions derived from source objects, operations, prerequisites, and scenarios. It must not invent triggers or discard source restrictions. Empty does not mean unknown or inapplicable.

rerank ​

FieldType / valuesDefaultPurpose
providervikingdb, cohere, openai, litellm, jev / nullnullRerank service; inferred from credentials when omitted
modelstring / nullnullOpenAI-compatible, LiteLLM, or Jev rerank model
modenoul, choice, or nullnoulJev rerank mode; null also uses noul
thresholdnumber0.1Minimum rerank score considered relevant; filters only model rerank scores, never vector scores, and a request score_threshold overrides it
max_input_tokensinteger; 0 or >= 1280Maximum estimated tokens per query-document pair; 0 disables truncation
log_payloadsbooleanfalseLog complete rerank request and response payloads; may expose query and document content

Rerank has no separate enabled field. It becomes available when the required provider credentials are configured.

jev supports direct TypeSafe access (https://api.typesafe.ai/v1/systemone, model jev-latest) and Vercel AI Gateway's TypeSafe-compatible endpoint (https://ai-gateway.vercel.sh/typesafe/v1/systemone, model typesafe-ai/jev) through the existing api_base and model fields; both speak the same protocol. For rerank, api_base may be either the service root or the complete System One URL; /v1/systemone is appended when absent. Its default noul mode scores each candidate independently. The optional choice mode compares all candidates and returns relative probabilities; set threshold to 0 when using it. Setting provider explicitly requires the credentials that provider needs: ak and sk for vikingdb, api_key for cohere and jev, api_key and api_base for openai, model for litellm. An incomplete block is rejected when the configuration loads.

Retrieval Settings ​

json
{
  "retrieval": {
    "enable_intent": true,
    "apply_rerank_to_context": false
  }
}

retrieval ​

FieldType / valuesDefaultPurpose
enable_intentbooleantrueRun intent analysis/query planning when session_id is present
apply_rerank_to_contextbooleanfalseRerank search(mode="context") candidates with the configured rerank model

Search and Find requests default to limit: 10; override the limit on each API or SDK request. retrieval.enable_intent controls LLM query planning for session-aware Search, while result reranking is enabled only when rerank has a usable provider configuration. Context mode recalls with Find's vector scores; with retrieval.apply_rerank_to_context and a usable rerank, it also reranks its merged candidates once against the original query and its expansions before quotas and the token budget apply, which adds one rerank call per request.

Storage Settings ​

json
{
  "storage": {
    "workspace": "./data",
    "skip_process_lock": false,
    "agfs": {
      "backend": "local"
    },
    "vectordb": {
      "backend": "local"
    },
    "parse_output": {
      "mode": "agfs"
    }
  },
  "parsers": {
    "download_temp_dir": "/data/openviking/parser-tmp"
  }
}

storage ​

FieldType / common valuesDefaultPurpose
workspacepath"./data"OpenViking workspace
agfs.backendlocal, memory, s3localFile and metadata backend
agfs.pathlock.providerfilesystem, memory, sqlite, cachefilesystemPath lock storage
agfs.pathlock.sqlite_pathabsolute local file path{workspace}/_system/pathlock/pathlock.db for sqliteShared SQLite lock database; optional override
vectordb.backendlocal, cuvs, http, volcengine, vikingdblocalVector database backend
vectordb.dimensionintegerfollows EmbeddingVector collection dimension
parse_output.modeagfs, localagfsBackend for intermediate parser artifacts
parse_output.local_rootpath or nullsystem temp directoryRoot directory used by local parser artifacts
skip_process_lockbooleanfalseSkip the workspace process lock; use only when accepting concurrent-write risk

For same-machine path locking on a local disk without recursive business-directory scans, set storage.agfs.pathlock to {"provider":"sqlite"}. The database defaults to {storage.workspace}/_system/pathlock/pathlock.db, resolved to an absolute path from the final workspace when initializing the runtime binding. An explicit absolute sqlite_path takes precedence. The database parent directory is created automatically. Omitting sqlite_path or setting it to null also uses this default when constructing RAGFSBindingClient(config_path=..., config={"service_name": ...}) directly. Every participating process must access the same actual local database file, with the same top-level service_name and lock expiry setting. Containers on the same host must share that local file; identical paths in separate container filesystems refer to independent databases and do not coordinate locks. SQLite stores authoritative lock tokens and atomically checks Exact/Tree conflicts using its path index. Blocking database work runs off the async executor. SQLite waits up to 100 ms per attempt for transient database writer contention, including when the logical lock wait timeout is zero. The provider retries only Busy, with three total attempts and 1 ms / 4 ms backoff. Database waits can total about 300 ms, plus 5 ms backoff and execution/scheduling overhead. Exhausted retries still report Busy to the manager; logical lock Conflict is not retried. WAL uses synchronous=FULL to preserve committed lock tokens after a crash, at the cost of additional synchronization I/O compared with NORMAL. Lease heartbeats refresh owned paths in one SQLite transaction (bounded batches for large leases). stale_locks_removed includes tokens recovered by committed atomic SQLite/Redis acquisitions; failed transactions do not increment the count.

SQLite acquisitions completely delete expired tokens belonging to other owners that conflict with the request: the target path, ancestor Tree locks, and all descendants of a requested Tree lock. Cleanup and acquisition share one transaction, so a previous owner cannot revive these tokens by refreshing them after takeover. Opportunistic global cleanup is limited to 256 tokens per acquisition; conflicting cleanup can exceed that limit and costs more for large expired subtrees.

Do not place the database on EFS, NFS, or SMB. SQLite WAL requires participants on the same machine and is not supported on network filesystems; frequent lock updates also add synchronization I/O. If storage.workspace is on EFS, the default database path is on EFS too. Moving it to each container's local disk creates independent lock authorities and cannot coordinate replicas.

For multiple containers or hosts sharing EFS, use shared Redis PathLock: set storage.agfs.pathlock.provider="cache" and top-level cache.provider="redis". All replicas must use the same Redis deployment, top-level service_name, and lock expiry setting. See the shared Redis configuration example. Shared QueueFS must also use a backend suitable for that deployment, such as storage.agfs.queuefs.backend="cache"; changing PathLock alone does not change the default SQLite queue backend.

Stop all participating processes before switching providers: SQLite and filesystem lock files do not share a protocol. Do not delete the database, WAL, or SHM files while participants are running. Crashed owners' tokens become eligible for takeover after lock_expire_secs (default 30 seconds). This setting does not change the workspace process lock or other backend concurrency constraints.

Holder-lease upgrades also require stopping all lock participants, including queue workers, before deploying the new native binding. The SQLite provider adds a holders column automatically. New code reads legacy owner tokens, but old processes cannot maintain holder records; do not mix versions against the same database, filesystem locks, or Redis namespace. Retain durable queued handoffs. Each lease renews and releases its own holder. Native adoption transfers only a live source holder. A missing or expired source, a historic payload without a holder, or a provider change requires recovery through adopt_or_reacquire, which validates account and coverage and acquires a fresh holder under the payload's original owner after a full conflict check. Replaying a payload through recovery may create multiple holders, so consumers must make business writes idempotent. With a crashed sole holder, foreign acquisitions wait until its configured expiry; the recovery helper can recover its delivery after expiry.

Remote backends also require endpoint, bucket/collection, credentials, and timeout fields. See Configuration for complete examples.

parse_output.mode=local avoids writing parser intermediates to shared AGFS. The same worker must commit the required bytes to the formal resource tree before enqueueing downstream work. Artifacts are temporary and are removed after the content commit; provision local_root with enough space for concurrent imports.

parsers ​

FieldType / common valuesDefaultPurpose
download_temp_dirpath or nullsystem temp directoryTemporary directory for built-in parser downloads, Git checkouts, and archive extraction

When configured, parsers create temporary directories with prefixes such as ov_git_ and ov_zip_ below this directory. When unset, the system temporary directory is used.

Queue Worker Settings ​

queue_workers.external_parse ​

FieldTypeDefaultDescription
max_concurrentinteger4Number of complete ExternalParse jobs consumed concurrently; must be greater than 0; requires a server restart after changes

This setting controls queue-job concurrency. It is separate from vlm.media.max_concurrent, which limits audio/video VLM calls, and does not limit individual Understanding API HTTP requests.

queue_workers.add_resource ​

FieldTypeDefaultDescription
max_concurrentinteger4Number of complete AddResource jobs consumed concurrently; must be greater than 0; requires a server restart after changes
file_operation_concurrencyinteger16Maximum concurrent file-level commit and fallback comparison operations within one AddResource job; must be greater than 0; requires a server restart after changes
file_vectorization_concurrencyinteger8Number of files concurrently read, prepared, and enqueued within one directory AddResource job when processing_mode="vectors_only"; must be greater than 0; values above the internal safety limit of 64 are capped; requires a server restart after changes

max_concurrent controls independent AddResource jobs. file_operation_concurrency controls file commit and fallback comparison work within one AddResource job, while file_vectorization_concurrency controls files within one vectors-only directory job.

queue_workers.reindex ​

FieldTypeDefaultDescription
max_concurrentinteger4Number of complete Reindex root jobs consumed concurrently; must be greater than 0; requires a server restart after changes

This setting limits independent asynchronous reindex requests. URI-overlapping requests remain protected by path locks, while VLM and embedding work continue to use their respective concurrency limits.

queue_workers.session_commit ​

FieldTypeDefaultDescription
max_concurrentinteger8Number of SessionCommit jobs consumed concurrently; must be greater than 0; requires a server restart after changes

queue_workers.external_task ​

FieldTypeDefaultDescription
max_concurrentinteger10Number of external asynchronous tasks consumed concurrently; must be greater than 0; requires a server restart after changes

Compile API Settings ​

FieldTypeDefaultDescription
base_urlstring""External service base URL, including http:// or https://; a non-empty value enables external Compile
gateway_tokenstring""Optional service credential used by OV to call the Compile Gateway
http_timeout_secondsnumber10Timeout for one HTTP request
poll_interval_msinteger30000External task polling interval

When base_url is configured, OV sends the current user's OV API key in X-API-Key. It sends X-Gateway-Token only when gateway_token is configured.

Reindex Settings ​

reindex ​

FieldTypeDefaultDescription
file_vectorization_concurrencyinteger8Number of files concurrently read, fingerprinted, and prepared by one resource/skill reindex task; must be greater than 0; values above the internal safety limit of 64 are capped; requires a server restart after changes

HTTP Server Settings ​

json
{
  "server": {
    "host": "127.0.0.1",
    "port": 1933,
    "workers": 1,
    "executor_threads": 0,
    "auth_mode": "dev",
    "cors_origins": ["http://localhost:5173"],
    "profile_enabled": false,
    "temp_upload": {
      "default_mode": "local"
    }
  }
}

server ​

FieldType / valuesDefaultPurpose
hostIP / hostname"127.0.0.1"Listen address
portinteger1933Listen port
workersinteger1Worker process count
executor_threadsnon-negative integer0Maximum threads in each worker process's default asyncio executor; 0 uses Python's default sizing policy
timeout_keep_aliveinteger (seconds)5Idle HTTP keep-alive timeout; raise it above the upstream's idle-connection lifetime
auth_modedev, api_key, trusted / nullnullAuth mode; null is inferred from root_api_key
root_api_keystring / nullnullRoot key; setting it defaults auth to api_key
cors_originsstring[]["*"]Allowed origins
profile_enabledbooleanfalseAllow performance profiles
with_botbooleanfalseEnable the VikingBot API proxy
bot_api_urlURLhttp://localhost:18790VikingBot OpenAPI endpoint
public_base_urlURL / nullnullExternally visible base URL
upload_signed_ttl_secondsinteger600Signed upload and download URL lifetime
temp_upload.default_mode"local" / "shared""local"Temporary upload storage

Encryption and API Key Hashing ​

File encryption and API key hashing are configured in the top-level encryption section, not under server:

json
{
  "encryption": {
    "enabled": false,
    "api_key_hashing": {
      "enabled": false
    }
  }
}
FieldType / valuesDefaultPurpose
encryption.enabledbooleanfalseEnable file-level AES encryption
encryption.api_key_hashing.enabledbooleanfalseStore API keys with Argon2id

See Encryption for provider and key-management settings.

Authentication Modes ​

ValueUse case
devLocal-only development without API keys
api_keyValidate root/user/admin keys
trustedTrust an upstream gateway to inject account/user identity

Memory Settings ​

json
{
  "memory": {
    "custom_templates_dir": "",
    "experimental_memory_switch": false,
    "eager_prefetch": true,
    "prefetch_search_topn": 5,
    "extraction_enabled": true,
    "session_skill_extraction_enabled": false,
    "link_enabled": false
  }
}

memory ​

FieldType / valuesDefaultPurpose
custom_templates_dirpath""Custom memory template directory; a matching memory_type overrides the loaded template
experimental_memory_switchbooleanfalseEnable experimental templates
eager_prefetchbooleantrueSearch and read memories before extraction
prefetch_search_topninteger, >= 15Results read during prefetch
extraction_enabledbooleantrueExtract long-term memories on session commit
session_skill_extraction_enabledbooleanfalseAlso extract reusable skills
link_enabledbooleanfalseGenerate and resolve memory links

Automatic commits require a separate policy; enabling memory extraction does not make sessions commit automatically. See memory.session_auto_commit in Configuration and the Sessions API. For template loading order and when changes take effect, see the Prompt Guide.

Parser Settings ​

Parsers live under parsers:

json
{
  "parsers": {
    "pdf": {},
    "code": {
      "code_summary_mode": "ast",
      "extract_functions": true,
      "extract_classes": true,
      "max_token_limit": 50000
    },
    "image": {},
    "audio": {},
    "video": {},
    "markdown": {},
    "anydoc": {
      "enabled": true
    },
    "html": {},
    "text": {},
    "directory": {
      "preserve_structure": true,
      "max_files": null,
      "max_depth": 10,
      "max_concurrent": 4
    },
    "feishu": {
      "domain": "https://open.feishu.cn",
      "max_rows_per_sheet": 1000,
      "max_records_per_table": 1000,
      "download_images": true
    },
    "webfeed": {}
  }
}

parsers.directory.max_files defaults to null, meaning no file-count limit. Set it to a positive integer to limit the number of files per directory import.

parsers.directory.max_concurrent is shared by all directory imports in the server event loop. With the default value 4, one directory can run four Understanding jobs concurrently, while multiple concurrent directories still run at most four in total.

max_files and max_depth apply when Understanding directory routing is enabled. Each DirectoryParser scan applies these limits independently before submitting its own Understanding requests. A nested ZIP starts a new directory scan and does not share the outer scan's file-count or depth budget. When Understanding is disabled, native OpenViking directory parsing does not apply these two limits.

When a local directory is added through the client, the complete directory ZIP is subject to the /resources/temp_upload size limit. After extraction, DirectoryParser does not impose a common per-file byte limit. Each selected file follows the limits and upload behavior of its assigned built-in parser or Understanding API backend.

SettingPurpose
pdfPDF text, image, and layout parsing
codeRepository file types, ignore rules, and network safety
imageImage understanding and OCR
audio, videoAudio/video parsing
markdown, html, textText document chunking
anydocOffice and EPUB conversion; enabled=false rejects those formats
directoryDirectory scanning and ignore rules
feishuFeishu/Lark access and parsing
webfeedSitemap, RSS, and Atom ingestion

Provider-, parser-, storage-, and encryption-specific fields are documented in Configuration.

Minimal Example ​

json
{
  "embedding": {
    "dense": {
      "provider": "volcengine",
      "model": "doubao-embedding-vision-251215",
      "api_base": "https://ark.cn-beijing.volces.com/api/v3",
      "api_key": "<your-ark-api-key>",
      "dimension": 1024,
      "input": "multimodal"
    }
  },
  "vlm": {
    "provider": "volcengine",
    "model": "doubao-seed-2-0-code-preview-260215",
    "api_base": "https://ark.cn-beijing.volces.com/api/v3",
    "api_key": "<your-ark-api-key>",
    "thinking": false
  },
  "storage": {
    "workspace": "./data"
  },
  "server": {
    "host": "127.0.0.1",
    "port": 1933
  }
}

Open source under the AGPL-3.0 License. Font licenses