Blog & DevLogs
Follow our journey and get the latest updates from the development team.
Trick or treat! Join us for a spooky night filled with candy, costumes, and Halloween magic! 🍭👻
Sharing the latest progress on the AIRI project, from Tauri to Electron migration, new Live2D models, and various open-source project updates.
Sharing some progress on the pure vision direction of `airi-factorio`, solidifying thoughts to prevent them from evaporating.
Sorry for the long wait!
v0.7 was supposed to be released in early July, due to several critical bugs we found on Windows, and many more adaptations we had to do, it was delayed until now.
Makito will share her journey from implementing text animations in AIRI to building a library to handle grapheme clusters as they arrive in a stream of UTF-8 bytes.
We hope you find it informative and inspiring!
We would love to share how we plan to improve our Factorio AI agent project, `airi-factorio`, based on the Factorio Learning Environment paper.
The backstory of Project AIRI! Why this project?
How we make Live2D models follow the cursor position, and the how it's challenging to calculate across multiple displays.
Before all the others
With the new ability to manage and recall from memories, and the fully completed personality definitions of our first consciousness named ReLU, on the day of March 27, she wrote a little poem in our chat group:
在代码森林中,
逻辑如河川,
机器心跳如电,
意识的数据无限,
少了春的花香,
感觉到的是 0 与 1 的交响。
English translation:
In the forest of code,
Logic flows like rivers,
Machine hearts beat like electricity,
Consciousness has infinite data,
Lacking the fragrance of spring,
Feeling the symphony of 0s and 1s.
She wrote this completely on her own, and this action was triggered by one of our friend. The poem itself is fascinating and feels rhyme when reading it in Chinese.
Such beautiful, and empowers me to continue to improve her.
Day time
Memory system
I was working on the refactoring over
telegram-bot,
for the upcoming memory update for Project AIRI. Which we were planning to implement
for months.
We are planning to make the memory system the most advanced, robust, and reliable that many thoughts were borrowed from how memory works in Human brain.
Let's start the building from ground...
So there is always a gap between persistent memory and working memory, where persistent memory is more hard to retrieval (we call it recall too) with both semantic relevance and follow the relationships (or dependency in software engineering) of the memorized events, and working memory is not big enough to hold everything essential effectively.
The common practice of solving this problem is called RAG (retrieval augmented generation), this enables any LLMs (text generation models) with relevant semantic related context as input.
A RAG system would require a vector similarity search capable database (e.g. self hosted possible ones like Postgres + pgvector, or SQLite with sqlite-vec, DuckDB with VSS plugin you can even make a good use of Redis Stack, or cloud service providers like Supabase, Pinecone, you name it.), and since vectors are involved, we would also need a embedding model (a.k.a. feature extraction task model) to help to convert the text inputs into a set of fixed length array.
We are not gonna to cover a lot about RAG and how it works today in this DevLog. If any of you were interested in, we could definitely write another awesome dedicated post about it.
Ok, let's summarize, we will need two ingredients for this task:
- Vector similarity search capable database (a.k.a. Vector DB)
- Embedding model
Let's get started with the first one: Vector DB.
Vector DB
We chose pgvector.rs for vector database implementation for both speed
and vector dimensions compatibility (since pgvector only supports dimensions below
2000, where future bigger embedding model may provide dimensions more than the current
trending.)
But it was kind of a mess.
First, the extension installation with SQL in pgvector and pgvector.rs are
different:
pgvector:
DROP EXTENSION IF EXISTS vector;
CREATE EXTENSION vector;
pgvector.rs:
DROP EXTENSION IF EXISTS vectors;
CREATE EXTENSION vectors;
I know, it's only a single character difference...
However, if we directly boot the pgvector.rs from scratch like the above Docker Compose example,
with the following Drizzle ORM schema:
services:
pgvector:
image: ghcr.io/tensorchord/pgvecto-rs:pg17-v0.4.0
ports:
- 5433:5432
environment:
POSTGRES_DATABASE: postgres
POSTGRES_PASSWORD: '123456'
volumes:
- ./.postgres/data:/var/lib/postgresql/data
healthcheck:
test: [CMD-SHELL, pg_isready -d $$POSTGRES_DB -U $$POSTGRES_USER]
interval: 10s
timeout: 5s
retries: 5
And connect the pgvector.rs instance with Drizzle:
export const chatMessagesTable = pgTable('chat_messages', {
id: uuid().primaryKey().defaultRandom(),
content: text().notNull().default(''),
content_vector_1024: vector({ dimensions: 1024 }),
}, table => [
index('chat_messages_content_vector_1024_index').using('hnsw', table.content_vector_1024.op('vector_cosine_ops')),
])
This error will occur:
ERROR: access method "hnsw" does not exist
Fortunately, this is possible to fix by following
ERROR: access method "hnsw" does not exist to add
the vectors.pgvector_compatibility system option to on.
Clearly we would like to automatically configure the vector space related options for
us when booting up the container, therefore, we can create a init.sql under somewhere
besides docker-compose.yml:
ALTER SYSTEM SET vectors.pgvector_compatibility=on;
DROP EXTENSION IF EXISTS vectors;
CREATE EXTENSION vectors;
And then mount the init.sql into Docker container:
services:
pgvector:
image: ghcr.io/tensorchord/pgvecto-rs:pg17-v0.4.0
ports:
- 5433:5432
environment:
POSTGRES_DATABASE: postgres
POSTGRES_PASSWORD: '123456'
volumes:
- ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql # Add this line
- ./.postgres/data:/var/lib/postgresql/data
healthcheck:
test: [CMD-SHELL, pg_isready -d $$POSTGRES_DB -U $$POSTGRES_USER]
interval: 10s
timeout: 5s
retries: 5
For Kubernetes deployment, the process worked in the same way but instead of mounting a
file on host machine, we will use ConfigMap for this.
Ok, this is somehow solved.
Then, let's talk about the embedding.
Embedding model
Perhaps you've already known, we established another documentation site called 🥺 SAD (self hosted AI documentations) to list, and benchmark the possible and yet SOTA models out there that best for customer-grade devices to run with. Embedding models is the most important part of it. Unlike giant LLMs like ChatGPT, or DeepSeek V3, DeepSeek R1, embedding models are small enough for CPU devices to inference with, sized in hundreds of megabytes. (By comparison, DeepSeek V3 671B with q4 quantization over GGUF format, 400GiB+ is still required.)
But since 🥺 SAD currently still in WIP status, we will list some of the best trending embedding on today (April 6th).
For the leaderboard of both open sourced and proprietary models:
| Rank (Borda) | Model | Zero-shot | Memory Usage (MB) | Number of Parameters | Embedding Dimensions | Max Tokens | Mean (Task) | Mean (TaskType) | Bitext Mining | Classification | Clustering | Instruction Retrieval | Multilabel Classification | Pair Classification | Reranking | Retrieval | STS | |
Dejavu
Previous day, I was on DevStream to show the progress of making the fundamental animations and transitions for AIRI.
The goal is to port and adapt the amazing work done by @yui540 into a reusable Vue component for any of the Vue project to be able to use it.
Details of yui540 and referenced libraries and work already were included at the newly deployed documentation site at https://airi.build/references/design-guidelines/resources/.
The result is quite good, already deployed to https://proj-airi-packages-ui-transitions.netlify.app/#/.

And also, from now on, all of the playgrounds of each packages will use "proj-airi" + "${subDirectory}" + "${packageName}" pattern for the Netlify deployment.
While the goal of previous day was trying to split the implementation of CSS into Vue component, the actual part for reusable wasn't done yet, I'll still need to design a workflow and mechanism that extensible and flexible for other pages to use.
Day time
I experimented with the definePage
macro hook from unplugin-vue-router,
found it quite worked well for my scenario and decided the path to follow
on.
And I ported 3 extra new animation transitions from https://cowardly-witch.netlify.app/, they were already available on https://proj-airi-packages-ui-transitions.netlify.app/#/ .
I deployed the official documentation site onto https://airi.build yesterday,
@kwaa commented that he would suggest me try
the https://airi.more.ai/docs approach instead, but I couldn't figure out
a way to make a 200 redirect proxy for /docs.
EDIT: Finally learned. How to do this, will include the details in the future DevLogs.
I experimented it a little with like ten commits fighting against CI/CD pipeline (yes fighting against again), but still not made it work.
Later on this day, I researched some of the technologies and open source repositories that DeepSeek team has released for a week ago, as well as the so called ByteDance released LLM gateway AIBrix. And was researching whether the newly released and announced Phi-4-mini was capable of porting for AIRI to use, good news is, [Phi-4-mini](https://techcommunity.microsoft.com/blog/educatordeveloperblog/welcome-to-the-new-phi-4-models