OpenSource-Hub

OpenViking

프레임워크

volcengine/OpenViking

자가 진화 컨텍스트 데이터베이스로 에이전트 메모리, 지식 검색 및 스킬을 통합합니다.

개요

OpenViking은 viking:// 가상 파일 시스템으로 메모리, 리소스, 스킬을 통합 저장하며, 콘텐츠를 L0/L1/L2 세 계층으로 나누어 필요에 따라 로드합니다. 관측 가능한 검색 궤적을 지원하여 AI 에이전트가 장기 메모리와 지식을 효율적으로 관리할 수 있도록 돕습니다.

README 미리보기

\n\n\n  \n    \n  \n\n\n### OpenViking: The Context Database for AI Agents\n\nEnglish / [中文](README_CN.md) / [日本語](README_JA.md)\n\nWebsite · Live Demo · GitHub · Issues · Docs\n\n[](https://github.com/volcengine/OpenViking/releases)\n[](https://github.com/volcengine/OpenViking)\n[](https://github.com/volcengine/OpenViking/issues)\n[](https://github.com/volcengine/OpenViking/graphs/contributors)\n[](https://github.com/volcengine/OpenViking/blob/main/LICENSE)\n[](https://github.com/volcengine/OpenViking/commits/main)\n\n👋 Join our Community\n\n📱 Lark Group · WeChat · Discord · X\n\n\n\n\n\n***\n\n## What is OpenViking\n\nOpenViking is an open-source context database for AI agents. It stores memories, resources, and skills as one virtual filesystem under the `viking://` protocol, so an agent browses its own context with `ls`, `tree`, and `find` instead of querying a black-box vector store. Content is processed into three tiers — L0 abstract, L1 overview, L2 details — and loaded on demand. Every retrieval leaves a trajectory you can watch and debug. Full introduction: [Getting started](https://docs.openviking.ai/en/getting-started/01-introduction).\n\n[](https://openviking.ai/studio)\n\n*The [OpenViking Studio](https://openviking.ai/studio) playground — a live demo you can open in the browser, no installation required.*\n\n## Why OpenViking\n\n- **One filesystem for all context.** Memories, resources, and skills each get a `viking://` URI. Agents locate and manipulate context deterministically, like a developer working with files. → [Viking URI](https://docs.openviking.ai/en/concepts/04-viking-uri) · [Context types](https://docs.openviking.ai/en/concepts/02-context-types)\n- **Tiered loading cuts token spend.** Every entry is processed into L0 (abstract), L1 (overview), and L2 (details) on write, then loaded only as deep as the task requires. → [Context layers](https://docs.openviking.ai/en/concepts/03-context-layers)\n- **Directory recursive retrieval.** Vector sear

FAQ (5)

문제 해결
OpenViking ov compile에서 "complete_tool_result() got an unexpected keyword argument 'preserve_complete'" 오류를 해결하는 방법

이 오류는 OpenViking main(커밋 54d4c0fac, v0.5.2.1+38 / 0.5.3.dev40)에서 발생하며, ov compile이 최종 검토 단계를 조용히 건너뛰고 result.warnings에 "Final review incomplete; publishing original artifacts" 경고를 보고합니다.

**근본 원인:** PR #6364에서 bot/vikingbot/agent/loop.py의 AgentLoop를 업데이트하여 새 키워드 인자 preserve_complete를 사용해 프리뷰 훅을 호출하도록 변경했지만, bot/vikingbot/compile/pipeline_agent.py(약 55번째 줄)에 있는 Compile 파이프라인의 커스텀 훅은 여전히 기존의 두 개 매개변수 시그니처를 사용하므로, 모든 프리뷰 호출이 파이프라인에 의해 삼켜지는 TypeError를 발생시킵니다.

**수정 방법:** bot/vikingbot/compile/pipeline_agent.py를 편집하여 훅 시그니처가 새 플래그를 받도록 업데이트하세요(Compile은 하위 도구 결과를 무조건 완전한 상태로 유지하므로 이 플래그는 무시해도 됩니다):

async def complete_tool_result(result, session_key, preserve_complete: bool = False):
    """Compile keeps child tool results complete unconditionally; the flag is
    accepted for signature parity with the AgentLoop preview hook."""
    return result

그런 다음 openviking-server를 재시작하고 ov compile을 다시 실행하세요. 검증된 결과: 작업이 warnings: [] 상태로 완료되고 최종 검토 단계가 정상적으로 실행됩니다.

원본 Issue #6692
문제 해결
commit_count가 0으로 표시되고 짧은 세션을 전혀 아카이브하지 않는 DSH memory plugin 문제를 해결하는 방법

플러그인은 공유 기본값 keep_recent_count: 10을 전송하므로, 메시지가 10개 미만인 세션은 최종 dispose() 커밋 중에 최근 테일의 모든 메시지를 유지하며 아카이브되지 않습니다. DSH와 같이 자체 컨텍스트를 관리하는 하네스의 경우 세션 종료 커밋 시 해당 값을 0으로 설정하세요. 임시 해결 방법: OPENVIKING_COMMIT_KEEP_RECENT_COUNT=0을 설정하여 실행하세요. 코드에서는 examples/dsh-memory-plugin/runtime.mjs의 DSH 최종 커밋이 keep_recent_count: 0을 전송하도록 변경하세요. 동일한 수정이 Claude Code와 Codex auto-capture.mjs의 토큰 임계값 커밋에도 적용됩니다. OpenViking이 컨텍스트를 관리하는 플러그인은 구성 가능한 테일을 유지해야 합니다. PR "fix(plugins): archive every message on session commit."이 포함된 릴리스로 업데이트하세요.

원본 Issue #5458
문제 해결
Web Studio Compile 페이지 크래시 해결 방법: "Cannot read properties of undefined (reading 'length')"?

이 문제는 선택적 --from 플래그 없이 컴파일 작업이 생성된 경우 OpenViking 0.4.23에 영향을 미칩니다. Studio 행 렌더러는 r?.from.length를 확인하지만 from 자체는 가드하지 않으므로, meta.request.from이 누락된 작업이 있으면 /studio/compile 라우트 전체가 크래시합니다.

임시 해결 방법: 문제가 되는 작업을 제외하는 필터를 적용하여 Compile 페이지를 여세요. 예를 들면:

/studio/compile?status=completed

문제의 작업 자체가 completed 상태라면, 다른 상태 필터를 사용하거나 아무것도 일치하지 않는 쿼리를 사용하세요:

/studio/compile?q=__no_match__

task API는 정상이며, 장애는 Studio 렌더링에서만 발생합니다.

영구 수정 방법: PR fix(studio): normalize missing compile sources가 포함된 릴리스로 업그레이드하거나, Studio API 경계에서 누락되었거나 null인 소스 목록을 정규화하세요:

const from = r?.from ?? [];
from.length ? from.map(/* render source */) : "—";

최소한의 프런트엔드 안전 가드는 다음과 같습니다:

r?.from?.length ? r.from.map(/* render source */) : "—"

원본 Issue #5608
문제 해결
OpenViking Hermes 플러그인에서 'declared `on_session_end` hook is not registered' 경고를 해결하는 방법은 무엇인가요?

이는 OpenViking이 일반 훅 레지스트리 대신 Hermes의 memory-provider 라이프사이클을 통해 등록될 때 발생하는 오탐입니다. OpenViking Hermes 플러그인 매니페스트에서 선언된 hooks 목록에서 on_session_end를 제거하십시오. OpenVikingMemoryProvider.on_session_end()를 제거하거나 ctx.register_memory_provider(OpenVikingMemoryProvider())를 변경하지 마십시오. Hermes는 여전히 MemoryProvider 라이프사이클을 통해 세션 종료 커밋을 호출합니다. 플러그인을 리로드/재설치한 다음 hermes plugins doctor openviking을 다시 실행하십시오. Hermes 0.21.5와 함께 OpenViking 플러그인 2.0.1을 사용하는 동안 세션 커밋이 성공하면, 매니페스트 수정이 설치될 때까지 해당 경고를 안전하게 무시할 수 있습니다.

원본 Issue #5713
문제 해결
OpenViking 플러그인 HTTP 클라이언트가 response body 타임아웃 또는 connection reset 발생 시 재시도하는 대신 빈 결과와 함께 HTTP 200을 반환하는 문제를 해결하는 방법은?

plugin PR #5661이 포함된 소스 리비전 또는 릴리스로 업그레이드하세요. 이 PR은 examples/memory-plugin-shared/lib/ov-http.mjs를 수정하며, openclaw 및 pi-experimental 클라이언트에 대한 보조 수정도 함께 포함합니다. 커밋 d9352f2a8bac78cbf4ed08b26543d22adcdd4c93에 고정되어 있는 경우, 해당 변경 사항을 cherry-pick하세요.

결함은 response.json()을 감싼 광범위한 catch에 있습니다. 이로 인해 본문 읽기 중 발생한 전송 실패가 유효하지 않거나 빈 JSON 처리로 변환됩니다. 수정은 abort/네트워크/스트림 오류를 다시 던져서, 기존 외부 핸들러가 다음을 반환하도록 해야 합니다:

{ ok: false, status: 0, result: null }

그리고 isRetryableFailure(result)가 true를 반환해야 합니다. 자체적으로 관리하는 타임아웃의 경우, 원래 오류는 error.name === "AbortError"와 error.aborted === true를 유지해야 합니다.

개념적으로 다음과 같은 가드를 사용하세요:

try {
  result = await response.json();
} catch (err) {
  if (
    err?.name === "AbortError" ||
    err?.aborted === true ||
    err?.cause?.code === "UND_ERR_SOCKET"
  ) {
    throw err; // 외부 전송 핸들러가 분류하고 재시도하도록 합니다.
  }

  // 완전히 수신된, 형식이 잘못되었거나 빈 JSON 본문에 대해서만 기존 처리를 유지합니다.
}

requireJsonBody: true를 우회책으로 사용하지 마세요. strict 모드는 증상을 재시도 불가능한 HTTP 200 empty or invalid JSON response 실패로 바꿉니다. 패치 후에는 정상적인 성공 응답, HTTP 오류, 그리고 완전히 수신된 형식 오류/빈 JSON 본문이 이전 동작을 유지하며, 본문을 읽는 동안 발생하는 지연(stall), 리셋, 중단(abort), 손상된 스트림만 재시도 가능한 status-0 전송 실패가 됩니다.

원본 Issue #5658