agent

agent
Security Audit
Warn
Health Warn
  • No license — Repository has no license file
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Community trust — 10 GitHub stars
Code Warn
  • process.env — Environment variable access in apps/admin/playwright.config.ts
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

TypeScript 服务端 Agent Runtime,不依赖 LangChain:Agent Loop、Tool Calling、上下文工程、pgvector 混合检索、引用逐条校验,每次运行全程落库可审计。

README.md

TypeScript Agent Runtime

从零手写的全栈 AI Agent 运行时 —— 不依赖 LangChain / Workflow 引擎,每一行编排逻辑都可读、可测、可审计。

流式对话 · 有界 Agent Loop · Tool Calling · Token 级上下文工程 · pgvector 混合检索 · 服务端校验的证据引用

TypeScript
NestJS
Vue
PostgreSQL
DeepSeek
Gemini
Tests

这是什么

一个完整闭环的知识库问答 Agent:用户在 Web 前台提问,Runtime 在服务端预算内编排模型采样与工具调用,从 pgvector 索引中做混合检索,最终产出每条引用都经过服务端校验的带证据回答——全过程持久化为可审计的 Run / Step 轨迹,并配有独立的运维控制台。

它不是又一个框架 Demo。所有编排(采样轮次、工具执行、上下文预算、终态提交、引用校验)都是显式 TypeScript 代码,这也是它作为 Agent 工程学习样本的价值:没有任何一步藏在黑盒里

架构

flowchart LR
    Web[Vue 前台] -->|NDJSON 流| API[ChatController]
    Admin[运维控制台] --> AdminAPI[Admin API]
    API --> Runtime[Agent Runtime<br/>runTurnStream]
    Runtime --> Context[ModelContext<br/>token 预算 / 因果历史]
    Runtime --> Grounding[Grounding<br/>证据注册 / 引用校验]
    Runtime --> LLM[LLM Service] -->|SSE| DeepSeek([DeepSeek API])
    Runtime --> Tools[Tool 边界] --> Retrieval[混合检索<br/>lexical + vector RRF]
    Retrieval --> Gemini([Gemini Embedding])
    Retrieval --> DB[(PostgreSQL<br/>+ pgvector)]
    Runtime --> Recorder[Run / Step 记录] --> DB
    AdminAPI --> DB

一次带引用回答的完整生命周期:

用户提问
  -> 创建 AgentRun,解析模型与输入预算(本地 DeepSeek tokenizer 精确估算)
  -> 因果历史选择进入 ModelContext(COMPLETED-only、token 预算内)
  -> 模型采样(SSE 流式)
       -> 触发 retrieve_article_context 工具
       -> Gemini query embedding + pgvector 余弦检索 + lexical RRF 融合
       -> 证据注册:签发 Run 级不透明 citationKey,正文对模型扣留
  -> structured finalization:模型必须调用 submit_grounded_answer 提交答案与引用
  -> 服务端逐条校验 citationKey 与引用文本(fail-closed)
  -> Message / Grounding / Step / Run 单事务原子落库
  -> 前台渲染回答 + 可追溯的来源卡片

核心能力

能力 实现
有界 Agent Loop 服务端策略约束:默认 ≤10 轮采样、≤8 次 Tool Call、10 分钟 Run deadline
流式输出 Abort 感知的 NDJSON 增量流,中止 / 半包 / 消息版本竞态全部有守卫
Tool Calling 类型化定义、注册表、参数校验、执行隔离、超时与取消传播、按 Run 白名单
上下文工程 每 Run 独立 ModelContext,模型感知预算 + 动态历史选择 + Observation 治理
RAG 检索 确定性 HTML 分块、版本化 Embedding profile、精确余弦 + RRF(k=60) 混合
证据引用 引用是服务端校验的结构化事实,不是模型随手写的 Markdown [1]
可靠性 Run 剩余预算传导到 DB statement timeout;晚到结果 fencing;终态原子提交
可观测性 每次采样的输入 / 输出 / 预算决策 / 错误持久化;Admin 端 Run Trace 与检索审计

工程原则

  • 显式控制流 —— 编排逻辑就在 TypeScript 里,不藏在 workflow 引擎背后。
  • 模型输出不可信 —— 工具名、参数、引用 key 全部先校验再执行,检索正文以 untrusted data 隔离注入。
  • 分层消息模型 —— UI Message ≠ 模型输入 ≠ 运行事件 ≠ 持久化轨迹,各自独立契约。
  • 预算而非上限 —— Provider 容量只是天花板,模型实际看到什么由应用策略决定。
  • 终态所有权 —— 晚到的 Abort / deadline / DB 结果不能覆盖已确立的终态;COMMIT 结果不确定时如实暴露,不伪造成功。
  • 证据驱动演进 —— 550+ 项测试(含真实 PostgreSQL / pgvector / SDK 传输层集成测试)先行,能力后加。

快速开始

要求:Node.js ^20.19.0>=22.12.0、pnpm 10.32.1、Docker、一个 OpenAI-compatible 模型服务商的 API Key(DeepSeek 官方或中转站,启动后在管理台「模型接入」录入)、Gemini API Key(检索链路用)。

corepack enable
pnpm install
cp .env.example .env                                          # 填入 AGENT_SECRET_KEY / GEMINI_API_KEY,模型在管理台配置
docker compose up -d postgres                                 # 含 pgvector 的主库
pnpm prisma:generate
pnpm prisma:migrate
node --env-file=.env --import tsx apps/api/scripts/seed.ts    # 灌入 68 篇 Demo 文章(幂等)
pnpm --filter @agent/api index:articles -- --mode=incremental # 构建向量索引(调真实 Gemini)
pnpm dev
应用 地址
Web 前台 http://localhost:5173
运维控制台 http://localhost:5174
API http://localhost:3000/api

seed 与 index 是检索 / 引用链路可用的前提:跳过它们普通聊天仍可用,但 retrieve_article_context 会因缺少 active index 而 fail closed。自装 PostgreSQL 必须带 pgvector 扩展;从旧 postgres:16-alpine 卷升级时建议重置卷重建(musl→glibc collation 差异),开发数据可由 seed / index 完整重建。POSTGRES_DB 只在卷首次初始化时生效:沿用改名前(库名 agent_ai_seo)的已有卷时,.env 里的 DATABASE_URL 保留 agent_ai_seo,或重置卷按新库名 agent 重建。

完整环境变量见 .env.example;常用验证:pnpm typecheckpnpm lint、API 按边界拆分的测试入口(如 pnpm --filter @agent/api test:tools,完整清单见 apps/api/package.jsontest:* 脚本)、pnpm --filter @agent/ai test

packages/aipackages/contractsdist 被 API 运行时消费,包括 tsx --test 跑的 test:* 脚本;pnpm dev 会在启动前构建,但 dev 的 tsc --watch 只重编 API 自身,不重建包的 dist(类型检查会随包源码更新,运行时加载的仍是旧 dist)。改过 packages/ai/srcpackages/contracts/src 后手动重建:

pnpm --filter @agent/ai build
pnpm --filter @agent/contracts build

目录结构

apps/
  api/        NestJS API:Agent Runtime、Tool、检索与索引、Prisma 边界、LLM 门面与 DI 壳
  web/        Vue 3 对话前台(流式渲染 + 来源卡片)
  admin/      运维控制台(概览 / 会话记录 / Run Trace 与检索审计 / 模型接入)
packages/
  ai/         模型客户端、OpenAI-compatible 流适配、模型类型 / 错误 / profile(零 Nest、零 Prisma)
  contracts/  前后端共享协议与类型(编译期防漂移)
prisma/       PostgreSQL schema、pgvector migration 与 fixtures(seed 脚本在 apps/api/scripts/seed.ts)
docs/         路线图、任务归档、研究沉淀与工作日志

更多文档

阶段路线见 docs/roadmap.md,任务归档见 docs/tasks/,架构决策与推进记录见 docs/work-log.md。项目按 8 个阶段迭代完成:多轮流式对话 → 有界 Agent Loop → 上下文工程 → Grounded Retrieval,全部经 Issue / PR / 提交前 Review 与逐条验收收口。

Reviews (0)

No results found