mirror of
https://github.com/moeru-ai/airi.git
synced 2026-08-14 08:52:42 +00:00
## Summary - Bump catalog `@xsai/*`, `@xsai-ext/providers`, and `xsschema` to **0.5.0-beta.8**, and delete the three `@xsai/*` pnpm patches — the beta.2 ones from #1602 and the beta.8 regenerations that landed on main in `38a008500`. - Always capture tool failures on the core-agent chat path: xsAI beta.8 marks failed tool executions with `isError: true` on `tool-result.done`, and `llm-service.ts` maps that to AIRI's `tool-error` event via `toAiriStreamEvent`, so the agent loop continues instead of aborting. - Remove the `captureToolErrors` request flag (and stop forwarding it into `streamText`). - Rebased onto latest `main` (`b230e16b2`). Includes one follow-up fix: steps are marked settled before the finish listener runs, and finish listener failures still reject the stream. ### Related - Supersedes / follows up on [#1602](https://github.com/moeru-ai/airi/pull/1602) (`captureToolErrors` + xsai patches). ### Scope of capture | Case | Covered | | --- | --- | | A — unknown tool | yes | | B — invalid / unparseable arguments JSON | yes | | C — `validate` failure | yes | | D — `execute` throw | yes | | `missing_name` / `missing_arguments` | no (xsai still aborts) | | `repairToolCall` | no | Error copy on beta.8: `Tool "<toolName>" execution failed: …` (produced by xsAI). ## Test plan ### Automated (Vitest) - [x] core-agent `llm-service.test.ts` — 16/16 - [x] core-agent full suite — 82/82 - [x] stage-ui `llm.test.ts` + `chat.contract.test.ts` — 44/44 (the previous `stepsSettled` timing failure is fixed in this branch) - [x] stage-ui full suite — 594 passed / 0 failed (one browser-test-runner teardown error, not a test failure) - [x] typecheck — core-agent, stage-ui, component-calling, satori-bot pass; telegram-bot fails only at `src/utils/velin.ts`, which is pre-existing on main and untouched by this PR ### Real-environment E2E (rebase branch, DeepSeek V4 Flash via DeepSeek API) Harness: `/Users/lulu/GitHub/airi-e2e/pr2164/tool-error-e2e-rebase.mjs` — drives the built `core-agent` `streamFrom` with a deliberately failing tool. | Case | Result | Evidence | | --- | --- | --- | | D — execute throw | **pass** | `tool-error` carried `Tool "always_fail" execution failed: boom: deterministic tool failure`; the model answered: "The always_fail tool threw a deterministic error as expected." | | A — unknown tool | **pass** | The model called the unavailable `search_the_moon_database` after being told truthfully that this tests AIRI's error capture; runtime returned `tool-error` and the conversation continued. | | B — bad arguments JSON | not observed on real model | providers rarely emit invalid `arguments`; covered by unit test | | C — `validate` failure | pass (earlier manual run with a temporary validate-gated tool) | — | Evidence artifacts: `/Users/lulu/GitHub/airi-e2e/artifacts/pr2164/tool-error-e2e-2026-08-10T16-49-15-384Z.{json,log}` ### Notes / non-goals - Fallout-only updates for the xsai beta.8 API rename: `textStream`, `inputTokens` / `outputTokens` / `totalTokens` in component-calling / telegram / satori. --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
telegram-bot
Allow アイリ to talk to you and many other users in Telegram.
Getting started
Clone & install dependencies:
git clone git@github.com:moeru-ai/airi.git
pnpm i
pnpm run build:packages
Start Ollama instance for embedding models
ollama start
ollama pull nomic-embed-text
Create a .env.local file:
cd integrations/telegram-bot
cp .env .env.local
Fill-in the following credentials as configurations:
DATABASE_URL=postgres://postgres:123456@localhost:5432/postgres
TELEGRAM_BOT_TOKEN=''
LLM_API_BASE_URL=''
LLM_API_KEY=''
LLM_MODEL=''
LLM_RESPONSE_LANGUAGE=''
LLM_VISION_API_BASE_URL=''
LLM_VISION_API_KEY=''
LLM_VISION_MODEL=''
EMBEDDING_API_BASE_URL=''
EMBEDDING_API_KEY=''
EMBEDDING_MODEL=''
EMBEDDING_DIMENSION=''
For example:
DATABASE_URL=postgres://postgres:123456@localhost:5433/postgres
TELEGRAM_BOT_TOKEN='<Bot ID>:<Token>' # get one from @BotFather
LLM_API_BASE_URL='https://openrouter.ai/api/v1/' # if you use OpenRouter too
LLM_API_KEY='sk-or-v1-<token>'
LLM_MODEL='deepseek/deepseek-chat-v3-0324:free'
LLM_RESPONSE_LANGUAGE='English'
LLM_VISION_API_BASE_URL='https://openrouter.ai/api/v1/'
LLM_VISION_API_KEY='sk-or-v1-<token>'
LLM_VISION_MODEL='openai/gpt-4o' # as long as the model supports image input
EMBEDDING_API_BASE_URL='http://localhost:11434/v1/' # ollama
EMBEDDING_API_KEY=''
EMBEDDING_MODEL='nomic-embed-text' # embedding model
EMBEDDING_DIMENSION='768' # must set
Start both DB and the bot:
docker compose up -d
pnpm run -F @proj-airi/telegram-bot start