Conversation
eve 0.24.x peers ai ^7.0.26, so the whole workspace moves off 7.0.0-beta.178 to a single exact-pinned ai@7.0.30 (providers to stable ^4). Breaking for the eve adapter: eve >=0.24.0 renamed SandboxBackendHandle.dispose to shutdown() (fires only on server shutdown, session must stay reattachable) - the Box backend now does a tolerated box.pause(). Also fixes 7 pre-existing test failures the bump surfaced: tests passed colon-containing uniquePrefix() values as userIds, which core key-part validation rejects (unnoticed because Redis-less CI skips those suites). New colon-free uniqueUserId() helper in both test-supports.
AgentKit as a mountable eve extension (eve >=0.24): one file in agent/extensions/ composes memory tools, Redis Search tools, a durable chat-history hook, and a memory instructions fragment under one namespace. - search/search_aggregate/search_count are dynamic tools (session.started resolvers): their schema-derived descriptions need the runtime-bound mount config, and an unconfigured mount resolves to no tools instead of erroring - chat_history hook appends message.received/message.completed transcripts to core ChatHistory (agentkit:chat:<userId>:<sessionId>); on by default, chatHistory: false opts out; errors swallowed so a write never fails a turn - userId: string or (ctx: SessionContext) => string (eve's public base of tool + hook ctx); defaults to principal -> session id, ':' sanitized - unwanted slots are dropped via directory mount + disableTool() - examples/eve-extension-demo: minimal scaffold mounting the extension, verified live end to end (memory, $smart search, capture, recall)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
AgentKit for eve is now one file instead of one file per tool.
That single mount composes, under the
agentkit__namespace:agentkit__recall_memory/agentkit__save_memoryagentkit__search/agentkit__search_aggregate/agentkit__search_countsearchis configuredagentkit__chat_history(hook)agentkit:chat:<userId>:<sessionId>— searchable withChatHistoryDon't want a tool? Disable its slot:
Live, from
examples/eve-extension-demo(new):Technical details
Extension design
extension/extension.tsdeclares config withdefineExtension+ zod; non-JSON values (Redisclient,
userIdfunctions, thessearch schema) pass throughz.custom— the mount file isevaluated in the runtime, so live values are fine.
defineDynamic, resolved atsession.started), not static: theirdescriptions/input schemas are generated from the consumer's
search.schema(per-field filterguides for the model), and mount config is not bound when static modules evaluate at discovery.
One resolver per file keeps each tool in its own slot, so
disableTool()overrides still targetthem individually. Unconfigured
search→ resolver returnsnull→ tools don't exist.message.received/message.completedand appends via coreChatHistory.getChat+saveChat(events per session are dispatched in order, so theread-modify-write doesn't race). Errors are logged and swallowed — a thrown eve hook fails the turn.
On by default;
chatHistory: falseopts out.userIdfns are typed with eve's publicSessionContext(eve/tools) — the shared base of tooland hook ctx, so one function serves every contribution. Default derivation:
auth.current?.principalId ?? auth.initiator?.principalId ?? session.id, with:sanitized to_(eve principal ids like
eve:appwould violate core key-part validation).extension/lib/runtime.ts— extensions can have internal modules, unlikeagent files (eve's per-file snapshot restriction), which is exactly why this packaging wins.
@upstash/agentkit-eve: the Box sandbox backend, therate-limit channel auth, and
defineCachedTool.eve extension build;eveis a peer (^0.24.6); shipsextension/(source theconsumer recompiles) +
dist/(mount factory and./toolsre-exports for overrides /toolResultFrom).Version bumps (whole repo)
eve0.17.1 → 0.24.6everywhere, single lockfile copy. One API break:SandboxBackendHandle.dispose→
shutdown()(fires only on server shutdown, must leave the session reattachable) — the Boxbackend now does a tolerated
box.pause(), mirroring eve's own Vercel backend.aibeta7.0.0-beta.178→ stable7.0.30, exact-pinned everywhere (eve ≥0.24 declaresaias a peer, apps provide the single copy). Providers to stable:
@ai-sdk/openai ^4.0.15,@ai-sdk/provider ^4.0.3,@ai-sdk/react ^4.0.33.uniquePrefix()values as userIds, which core key-part validation rejects (unnoticed becauseRedis-less CI skips those suites). New colon-free
uniqueUserId()helper in both test-supports.Verification
pnpm lint/typecheck/build/testall green (69 tests against real Upstash Redis).eve-extension-demoexercised live end-to-end (real Redis + OpenAI):memory writes, schema-aware
$smartsearch, transcript capture, and cross-session recall verifiedin Redis.