Presentation of products
Aivory is an open-source, self-hosted multi-model AI conversation platform: the back end is Go 1.24 single-process service, the front end is React 19 single-page application, both packaged in the same container to provide the same-source service (SPA and React). /api The same area, listening. :8787 You can use it on your own server. docker compose up -d Get a complete set of AI workstations: Claude, GPT, Gemini and any OpenAI-compatible model unified access, streaming output, multiple tool calls, Python sandbox, knowledge base RAG, Deep Research, team workspace, image generation and a complete admin console all built-in.

| The project | Explained |
|---|---|
| The current version | 2.2.0 |
| Open source permission | Apache 2.0 |
| The Code Warehouse. | github.com/hjxwz123/Aivory |
| The official mirror. | ghcr.io/hjxwz123/aivory-app、ghcr.io/hjxwz123/aivory-sandbox、ghcr.io/hjxwz123/aivory-sandbox-sidecar |
| The service port | within the container. 8787 (Production of Compose default mapping host 80) |
| Depending on Stage | postgres:16-alpine / redis:7-alpine / qdrant:v1.12.4 (All can be selected, see below) |
| Technical Stage | Go 1.24 + React 19 + TypeScript 5 + Tailwind 4 |
If you are ready for a server with Docker, you can jump directly to to start quickly. After completion of deployment. Operation for the first time Create an administrator account and configure the first model.
Aivory is different.
Most self-deployed chats are just a thin layer of agents: forwarding requests to the model API and then pushing the streamed text back.Aivory goes further in a few places that really affect everyday use:
- ** The tool is a real flow line. **: model can perform up to 48 tool calls (12 provider cycles) in a single user message, and tools in different domains can be freely sequenced.The product of one tool is automatically stored in the sandbox file system for direct reading by the next tool.
- ** Conversation is a tree, not a linear log ** Edit the history question, re-generate the answer, change the model and try again, and open a new branch for each operation.
< 2/3 >Switching controls preserves the database's complete tree-shaped structure. - ** Admin Console changes come into effect ** channel, model, skills, user, system settings all operate in the managed UI, the next request comes into effect immediately after saving, without the need to restart the process. channel API key exists in the database rather than the environment variable, the rotating API key does not need to log in the host.
The Core Capacity
Many channels of conversation.
Switch between Claude/GPT/Gemini and any OpenAI-compatible endpoint within one UI set. The administrator accesses upstream on the channel dimension in the background (type: Anthropic/OpenAI/Gemini/OpenAI-compatible, fill in Base URL+API Key) and then creates a model entry visible to the user on the model page, configuring display names, icons, pricing, vision capabilities and tool patterns (native / prompt / none The same type can be configured with multiple channels.
The top of the model picker displays the administrator-defined label filter chip (such as “fast”, “multimodal”, “programmed”), selected tag is a narrow list; each message records the actual model used at the time. Channel and Model。
Export and Thinking Process
All model requests go streaming, front-end real-time reception via SSE: typing machine output, Markdown rendering, code high brightness, LaTeX formula. supports the folding display of thinking process (thinking), the thinking chain of the reasoning model is presented with the official response partition.
Real-time Multi-Wheel Tool Calling
model decides which tools to call, how many rounds to adjust, the entire process is pushed in real time through the SSE event, and users can see what each step is doing.
| Tools | Functionally |
|---|---|
web_search | Full web search via SearXNG (self-deployed) or Serper compatible backend |
web_fetch | Scrape the specified URL and extract text to comply with robots.txt and content security filtering |
fetch_image | Download images to the sandbox. /workspace/uploads/ Use of follow-up code. |
python_execute | Run Python code in an isolated sandbox to support full standard libraries, pip installations, and file I/O |
image_generate | Calling a configured image model to generate an image and save it as a product |
search_knowledge_base | Execute hybrid retrieval of the loaded knowledge base (intensive vector + BM25,RRF fusion) |
save_memory | Write into the user memory, subsequent conversation automatically injected |
use_skill | Execute administrator-defined skills (hint word template + asset package) |
Single-wheel tool call budget (abuse prevention and cost out of control):
| Tools | The normal upper limit. | The Deep Research Model |
|---|---|---|
web_search | 16 | 40 |
web_fetch | 12 | 25 |
fetch_image | 16 | 12 |
image_generate | 8 | 4 |
python_execute | 16 | 8 |
| ** All tools in total. ** | 48 | 150 |
The key mechanism is ** Automated document retention ** Every time python_execute Before the execution, the user uploaded documents in this conversation, image_generate Generated images, user-available skills assets, all are automatically located in the sandbox file system. Therefore, "analysis data.csv, draw a column chart, then make PPT" such cross-tool workflow can be sent end-to-end at a time, the user does not need any intermediate action.
For models that do not support native function calling, you can return to the quotation protocol according to the administrator configuration (in quotation mode, the provider cycle is limited to 6).
Deep research
Independent multi-rounder research engine: Mr. Model makes a research plan, then sends up to 40 web searches and 25 page scraps in parallel, cross-checks the assertions, and ultimately produces a complete overview report with references, with a real-time progress panel. Deep research。
The Python Sandbox
Each conversation has a separate sandbox container (HTTP sidecar service):
- Sessions are permanently saved during the conversation life cycle, and subsequent messages can read the files written in the previous rounds; the container is recovered and automatically rebuild the session, re-save the files and try again in a transparent way, without the user's perception.
- Code output (stdout / stderr / abnormal) live streaming; written
/workspace/output/The file becomes the product, and the following card form appears in the chat interface. - Sandbox by default ** Without Networks ** (
SANDBOX_NETWORK=noneWhen networking data is neededweb_fetch/fetch_imageIt is stored outside the sandbox. - When the sandbox address is not configured,
python_executeEnter security mode, only perform simple arithmetic, suitable for development debugging and demonstration.
Detailed Use of Python Sandbox与The Sandbox Deployment。
Knowledge Base and RAG
Each account can create multiple knowledge bases, support text / PDF / DOCX / XLSX / image uploads, and document status can be tracked (pending → parsing → embedding → ready).
- ** Degree Cut ** Small-to-big, approximately 12% overlapping, structural perception (code block, table, formula whole block reserve); each subset carries a title breadcrumb from the root to the current location.
- ** Mixed search ** Qdrant intensive vector + BM25 keyword retrieval, RRF fusion order, dynamic Top-K by similar degree, with reference to answer.
- ** Questioning the route. ** Task model: Classifies the query before retrieving
retrieve/full_doc/noneAnd rewrite the query, inject the full text of the small document directly, without wasting the recovery expenses. - MinerU OCR PDF with text layer resolution at the local millisecond level; scan PDF, DOCX, PPTX, XLSX, images to get MinerU cloud OCR. The original file is stored in your own S3 / Ali Cloud OSS barrels, MinerU only gets pre-signed URLs, credentials are not out-of-domain.
When Qdrant is not configured, the RAG automatically degrade to the full text, and the functionality is still available. The knowledge base。
The team workspace
Create a workspace in the first image menu and send out an invitation link for your colleagues to join. The conversation, project, knowledge base in the space is shared with all members and completely isolated from each person’s personal space. Any member can continue any conversation. ** Who sends who pays? ** The bubble is assigned to the author (self on the right, others with AI on the left, and the head is nicknamed); the creator can kick people, reset the invitation link, and delete the entire space. The team workspace。
Images are generated
Independent drawing patterns: Task model colouring, then counting credits by image model; administratorining style pre-set libraries; generating results into personal galleries, supporting reference-based editing and variation workflows. Images are generated。
Complete admin console
| The Module | Management of content |
|---|---|
| The channel | Base URL + API key for each provider, with multiple channels of the same type |
| The model | Start-up, display name, context window, pricing, per model UI controls, Deep Research exposure switches, tags |
| The label model | Create labels and assign them to the model, rendering as a filter chip at the top of the selector |
| Skilled | Keyword template + asset package use_skill Tools to Call |
| The User | Roles, user group allocation, real-time blocking, quota and credits |
| The workspace | Drill Members/Conversation/Projects/Knowledge Base, Conversation to view full records right away |
| Used quantity | Reports by user, model, purpose (chat / task / image / embedded) |
| set up | sandbox addresses, S3/OSS credentials, search backend, upload white lists, disable tools, compression policies, etc. |
| Backup and Migration | Full backup export import, configuration export import, vector maintenance |
| The Sandbox Inspector | Browse and clean a specific conversation sandbox workspace file |
All changes are saved and are effective without the need to restart the entire process. Review of admin console Begin to understand.
Backup and Migration
Complete backup with one-key export for admin console: single zip contains manifest, one JSONL (engine neutral) for each table, upload with product file, Qdrant vector points for collection. Large libraries go asynchronous export tasks. ** The Database Engine. ** SQLite backups can be imported into Postgres deployments and vice versa. Another lightweight “configure export/import” only transports channel, model, skills and other management assets without moving user data. Backup and Migration。
PWA and Multilingual
- ** Installation of PWA ** Support for adding to the desktop / main screen, the mobile end interface is completely reworked.
- ** The five languages. ** Chinese, English, Japanese, French, covering every page, conversation box, toast and error information, including admin console.
- Clear double themes, editorial sense of design system.
More capacity
| Capacity | Explained |
|---|---|
| The Conversation Tree | Redirect or try again. < N/M > Switch and not interrupt in the flow; drag scalable overview node chart; long conversation right edge side preview bar second positioning |
| Multiple models of review (Verify) | The second model performs counterfactual factual verification of answers, output by sentence references with structuralized findings and confidence badges of serious level. |
| Memory of Conversation | Asynchronous user facts are extracted each round and old memories are automatically determined to fail, and users can manage them on their own pages. |
| Projects and skills | Project containers (shared libraries + project-level instructions); gradual loading of administrator skills packs while running |
| Under the compression. | Keep the latest N rounds of original text, earlier rounds by task model scrolled summary, prefix cache friendly, do not modify the original archive |
| credits and user groups | Deadline + Permanent credits, by model quota, pre-send fee check, redeem code |
| The safety base | API key full backend agent, HMAC signature per request, capability token sharing/invitation, HTML sandbox preview, upload extension name and MIME white list, full speed limit |
Structural Overview
Aivory’s production model is five containers: app Single container simultaneously hosting front end SPA and /api (The same source, no CORS problems), the rest are data and executable components.
| The container | The mirror | Role of |
|---|---|---|
app | ghcr.io/hjxwz123/aivory-app | Go HTTP + SSE service, co-source hosted front-end SPA |
postgres | postgres:16-alpine | User, conversation, knowledge base, settings, usage records |
redis | redis:7-alpine | Caching, Frequency Limit Counting, Coil and Stream Recovery |
qdrant | qdrant/qdrant:v1.12.4 | RAG Vector Recovery |
sandbox | ghcr.io/hjxwz123/aivory-sandbox-sidecar | Code execution sandbox (only internal network) |
Redis, Qdrant, and sandbox are all optional components: not suitable REDIS_URL Use of cache and cohort during the process; not deserved QDRANT_URL When RAG goes the full injection back; not deserving SANDBOX_BASE_URL The timecode executes into secure mode. The database can even be used by default with embedded SQLite. The SQLite model。
Why choose Aivory?
Data owned
All the data falls on your own infrastructure: databases, vector libraries, upload files and products (binding loads to the host). DATA_DIR The model API key exists in the database and is proxyed by the backend, never exposed to the browser; under the document OCR scenario, MinerU only gets the pre-signed URL stored by your object, the credentials are not out of the domain; the shared workspace automatically shuts off cross-conversation memory.
Distribution of orders.
docker compose up -d After completion of the deployment, all five containers are ready. /api The same source, solve which domain name can be used, no need to configure PUBLIC_ORIGIN Or CORS; administrator accounts are created by the start page rather than environmental variables; then almost all configurations (channel, model, search backend, upload white list, etc.) are real-time modified in the admin console, saved that is effective, without the need to restart.
Engine Neutrality
A full backup is a self-described zip: one JSONL for each table, unrelated to a specific database engine. Starting today with SQLite, you can import the same backup into Postgres deployment (and vice versa) tomorrow, automatically processing sequences and external keys; Qdrant vectors carry backup and can also subsequently reconstruct fragmented text stored from the database. Your data will never be locked dead on a single engine or machine.
The next step.
| Targeted | The page |
|---|---|
| 5 minutes to deploy an Aivory set | to start quickly. |
| Create an administrator and configure the first model | Operation for the first time |
| Production level Docker Compose deployment | Deployment of Docker Compose |
| HTTPS and reverse proxy | The reverse proxy / Cloudflare |
| Understanding the core environmental variables | The Core Configuration / Advanced layout |
| Daily conversation functions. | Conversation functions |
| by admin console | Review of admin console |
| Quickly checked | Common Questions |