{"ref":"artifact:cap-js-agents","page":"/artifacts/cap-js-agents","json":"/artifacts/cap-js-agents.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"cap-js-agents","name":"@cap-js/agents","artifact_type":"cds-plugin","ecosystem":"cap","flavors":[{"key":"node","source":{"url":"https://github.com/cap-js/agents","title":"cap-js/agents — README","checked":"2026-09-13","quote":"# SAP Cloud Application Programming Model, agent development plugin for Node.js"}}],"domain":"ai-and-agents","origin_ring":"sap-official","description":{"one_line":"SAP's own CDS plugin for building agents inside a CAP service, wired to audit logging and telemetry through peer dependencies rather than leaving observability to the author.","short":"CDS plugin for building agents inside a CAP service","what_it_solves":"@agent on a service definition is the whole setup: the plugin generates MCP tools from that service's entities and actions, runs a ReAct loop over them and serves the result over A2A, with LangChain or Pi as the harness underneath. An AGENTS.md next to the service definition takes over from that generated agent — its frontmatter populates the agent card and its body is the system prompt — and SKILL.md files under a skills folder carry one workflow each, so what the agent is gets written in Markdown instead of in handlers. Around that sit the parts an application would otherwise build itself: @agent.hitl holds an action in A2A's input-required state until a person approves it, short-term memory goes to the connected primary database so a conversation survives a restart, quotas cap concurrent tasks, tasks per hour, tool calls and tokens per tenant and per user, and audit events and OpenTelemetry metrics appear when [@cap-js/audit-logging](artifact:cap-js-audit-logging) and [@cap-js/telemetry](artifact:cap-js-telemetry) are installed. An @agent-ified service imported from another CAP project is reached as a subagent over A2A, so one agent can delegate to others. In the development profile the plugin fetches model credentials from a local Claude Code or OpenCode installation; the aicore kind, which is the default for production and hybrid, connects to [SAP AI Core](artifact:btp-ai-core).","when_not_to_use":"Not as a gateway or proxy for SAP Application APIs: capire's guide states that CAP-level agents are intended only for exposing custom CAP application services and are not an SAP-endorsed architecture or pathway for agentic access to those APIs, and sends the reader to the SAP Architecture Center for the endorsed routes. Not as the screen a user of the application talks to, either — the chat preview in the generic index.html page is marked experimental and for local development."},"links":{"npm":"https://www.npmjs.com/package/@cap-js/agents","repo":"https://github.com/cap-js/agents"},"provides":[{"capability":"capability:agent-tooling","what_it_does":"Turns a service annotated @agent into an agent served over A2A, with MCP tools generated from the service's entities and actions and a ReAct loop; an AGENTS.md beside the service definition replaces that generated agent with one built from the directory, @agent.hitl holds an action for a person's approval, and the conversation's short-term memory sits in the connected primary database.","facets":[{"key":"brings","value":["Agent served from the service"],"source":{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents","title":"CAP-level Agents, abstract — capire","checked":"2026-10-15","quote":"The @cap-js/agents plugin allows to easily create enterprise grade CAP-level agents, served via the A2A protocol out-of-the-box."},"applies_to":{"ecosystems":["cap"],"flavors":["node"]}},{"key":"harness","value":["LangChain","Pi"],"source":{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents","title":"CAP-level Agents, abstract — capire","checked":"2026-10-15","quote":"The plugin uses state-of-the-art agent harness frameworks like LangChain or Pi internally."},"applies_to":{"ecosystems":["cap"],"flavors":["node"]}},{"key":"protocols","value":["A2A","MCP"],"source":{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents","title":"CAP-level Agents — capire","checked":"2026-10-15","quote":"the plugin auto-generates MCP tools from the service's entities and actions, creates a ReAct loop, and serves it via A2A protocol"},"sources":[{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents","title":"CAP-level Agents, abstract — capire","checked":"2026-10-15","quote":"served via the A2A protocol out-of-the-box"},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#autowired-tools-via-mcp","title":"CAP-level Agents, Autowired Tools via MCP — capire","checked":"2026-10-15","quote":"All entities and actions/functions defined in the CAP service are automatically made available as MCP tools to the agent locally."}],"applies_to":{"ecosystems":["cap"],"flavors":["node"]}},{"key":"state_store","value":"In the application database","source":{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#persistence","title":"CAP-level Agents, Persistence — capire","checked":"2026-10-15","quote":"The CAP-based agent harness provides short-term memory out-of-the-box via the connected primary database"},"applies_to":{"ecosystems":["cap"],"flavors":["node"]}},{"key":"human_approval","value":true,"source":{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#using-agent-hitl","title":"CAP-level Agents, Using @agent.hitl — capire","checked":"2026-10-15","quote":"Annotate a CDS action with `@agent.hitl` to require human approval before the agent may execute it."},"applies_to":{"ecosystems":["cap"],"flavors":["node"]}}],"sources":[{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents","title":"CAP-level Agents — capire","checked":"2026-10-15","quote":"the plugin auto-generates MCP tools from the service's entities and actions, creates a ReAct loop, and serves it via A2A protocol"},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#optional-agentsmd","title":"CAP-level Agents, Optional: AGENTS.md — capire","checked":"2026-10-15","quote":"When present, it replaces the generic default agentification: instead of the auto-generated ReAct agent, the plugin auto-builds the agent from the directory at startup — no custom handlers required."},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#optional-skillmds","title":"CAP-level Agents, Optional: SKILL.mds — capire","checked":"2026-10-15","quote":"you can define specific skills and their workflows in `SKILL.md` files within the `skills` subfolder"},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#using-agent-hitl","title":"CAP-level Agents, Using @agent.hitl — capire","checked":"2026-10-15","quote":"When the agent decides to call the action, the task pauses and transitions to the A2A `input-required` state instead of running the action immediately."},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#persistence","title":"CAP-level Agents, Persistence — capire","checked":"2026-10-15","quote":"This allows agents to persist conversational context and workflow checkpoints, so that they can resume sessions seamlessly even after server restarts"},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#subagents-via-a2a","title":"CAP-level Agents, Subagents via A2A — capire","checked":"2026-10-15","quote":"The main agent coordinates these subagents, and communicates with them via A2A endpoints."},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#quotas","title":"CAP-level Agents, Quotas — capire","checked":"2026-10-15","quote":"The plugin automatically enforces rate limits and resource quotas."},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#audit-logging","title":"CAP-level Agents, Audit Logging — capire","checked":"2026-10-15","quote":"When `@cap-js/audit-logging` is installed, the plugin automatically emits audit log events which record agent decisions, actions, tool usage, and outcomes."},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#telemetry","title":"CAP-level Agents, Telemetry — capire","checked":"2026-10-15","quote":"When `@cap-js/telemetry` is installed, the plugin automatically instruments the agent harness to emit OpenTelemetry tracing and metrics."},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#sap-api-policy","title":"CAP-level Agents, SAP API Policy — capire","checked":"2026-10-15","quote":"CAP-level agents are intended only for exposing custom CAP application services."},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#using-chat-preview","title":"CAP-level Agents, Using Chat Preview — capire","checked":"2026-10-15","quote":"A rudimentary experimental chat preview is provided in the generic index.html page"}]}],"requires":[{"ref":"artifact:btp-ai-core","requirement":"conditional","role":"llm-provider","condition":"The aicore kind is configured under cds.requires.llm, which capire states is the default for the production and hybrid profiles; development defaults to auto, which reads credentials from a local Claude Code or OpenCode installation, and mock returns dummy responses.","for":"The model the agent calls on each turn of its loop, reached through an SAP AI Core service instance.","sources":[{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#cdsrequiresllm","title":"CAP-level Agents, cds.requires.llm — capire","checked":"2026-10-15","quote":"The default for `production` and `hybrid`, connects to SAP AI Core"},{"url":"https://cap.cloud.sap/docs/guides/ai/cap-agents#cdsrequiresllm","title":"CAP-level Agents, cds.requires.llm — capire","checked":"2026-10-15","quote":"The LLM used by an agent is configured via `cds.requires.llm`."}]}],"provenance":{"discovered_via":[{"source":"source:npm"},{"source":"source:discover"}],"first_seen":"2026-08-30"},"maintainers":["actor:cap-js"],"contributors":["actor:akatuoro","actor:anjan-poonacha","actor:danjoa","actor:dellagustin-sap","actor:ignipae","actor:johannes-vogel","actor:lisajulia","actor:madankumarpichamuthu","actor:maxieckert-sap","actor:schiwekm","actor:sirsimon04","actor:sjvans","actor:stefanrudi","actor:swaldmann","actor:urfuwo"],"history":[{"date":"2026-09-08","field":"description.one_line","from":"CDS plugin for building agents","to":"SAP's own CDS plugin for building agents inside a CAP service, wired to audit logging and telemetry through peer dependencies rather than leaving observability to the author.","reason":"Placement copied the package's own npm description. Replaced with a line written for this graph — what it does and where it sits — because an unattributed sentence is an unattributed claim."},{"date":"2026-10-15","field":"description.what_it_solves, description.when_not_to_use","from":null,"to":"a paragraph on what the plugin serves and the two situations it is not for","reason":"The page carried only an index line while capire's CAP-level Agents guide documents the whole surface. Written from that guide re-read on 2026-10-15: the generated tools and ReAct loop, the AGENTS.md and SKILL.md route, @agent.hitl, the database-backed short-term memory, the quotas, the optional audit-logging and telemetry packages, subagents over A2A and the three LLM kinds. when_not_to_use carries the guide's own caution that CAP-level agents are not an SAP-endorsed pathway for agentic access to SAP Application APIs, and that the chat preview is experimental and for local development."},{"date":"2026-10-15","field":"provides.agent-tooling","from":"what_it_does on the generated tools, ReAct loop and A2A endpoint, one source","to":"the AGENTS.md route, the approval gate and the persisted short-term memory added, five property values and eleven sources","reason":"capability:agent-tooling declared four comparison properties on 2026-10-15 beside the existing protocols property. All five values are answered from the guide re-read the same day and scoped to the node flavor, the only one this plugin states: the plugin serves the agent itself, the harness underneath is named as LangChain or Pi, it serves A2A and generates MCP tools, short-term memory is in the connected primary database, and @agent.hitl requires human approval before an action runs."},{"date":"2026-10-15","field":"requires","from":null,"to":"artifact:btp-ai-core, conditional on the aicore kind","reason":"How the agent reaches a model was nowhere on the entry, while the Java module of the same plugin already carried the edge. capire's configuration table states that aicore is the default for the production and hybrid profiles and connects to SAP AI Core, with auto and mock as the development kinds, so the requirement is conditional and the condition names the alternatives."}],"drafted_with_ai":true},"effective_normative_relations":[{"instrument":"instrument:sap-developer-license-3-2-cap","relation":"use-constrained-by","sections":["1","2","3"],"applies_when":"A cds-plugin is used with SAP CAP materials, or an artifact is explicitly identified as a CAP plugin or application.","note":"This is inherited applicability, not a licence verdict about the artifact itself. Review the agreement for the actual materials and use; an explicit artifact relationship to another revision takes precedence.","scope":{"kind":"artifact"},"sources":[{"url":"https://cap.cloud.sap/resources/license/developer-license-3_2_CAP.txt","title":"SAP Developer License Agreement 3.2 CAP","checked":"2026-09-16","quote":"documentation, plug-ins, templates, scripts and sample code, libraries, software development kits"}],"inherited_from":"cap-plugins-and-applications","relevant_capabilities":["agent-systems-access","async-processing","data-import-export","database-connectors","deployment","destinations","llm-integration","mcp-servers","plugin-authoring","replication","retrieval-augmented-generation","rfc-connectivity"]}],"readings":{"liveness":[{"label":"Maintenance","tier":"good","evidence":"released this month"},{"label":"Continuity","tier":"good","evidence":"22 contributors, 3 publishers, org-owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-10, not archived"}],"compatibility":[{"label":"Declared for","tier":"good","evidence":">=9 — includes cds 10 and 9"},{"label":"Survived majors","tier":"unknown","evidence":"first released after @sap/cds 10 shipped"},{"label":"Maintainer's CI","tier":"good","evidence":"Auto Format green, 2026-10-23"}],"practice":[{"label":"Tests","tier":"good","evidence":"224 test files, npm test"},{"label":"Docs","tier":"fair","evidence":"README 2 KB"},{"label":"Changelog","tier":"good","evidence":"CHANGELOG in the repo"}],"reach":[{"value":257,"unit":"installs/week"},{"value":17,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-26","latest_version":"0.9.9","majors":{"0.0":{"version":"0.0.0","date":"2026-08-13"},"0.9":{"version":"0.9.1","date":"2026-08-14"}},"license":"Apache-2.0","first_release":"2026-08-13","last_release":"2026-10-23","releases":10,"cadence_days":6,"maintainers":3,"repository":"git+https://github.com/cap-js/agents.git","peer_cds":">=9","test_script":true,"types":false,"downloads_weekly":257,"stars":17,"forks":10,"open_issues":23,"archived":false,"pushed_at":"2026-10-26","license_spdx":"Apache-2.0","org_owned":true,"default_branch":"main","contributors":22,"tree_truncated":false,"test_files":224,"workflows":7,"other_ci":false,"readme_bytes":1843,"docs_files":0,"changelog":true,"license_file":true,"dts_files":0,"ci_status":"success","ci_run_at":"2026-10-23","ci_workflow":"Auto Format","ci_event":"push","readme_path":"README.md","readme_sha":"bb7c364746ae41f5a47ecde650920b373327d36e","months_since_release":0,"dormant":false,"repository_directory":null,"dependencies":16,"node_engine":">=22.0.0","downloads_monthly":1397,"created_at":"2026-07-24T14:01:49Z","open_prs":13,"first_commit":"2026-04-10","last_commit":"2026-10-23","commits":320,"repo_read":"2026-10-26"},"release_notes":{"license":"Apache-2.0","quotable":true,"source":{"kind":"repo","path":"CHANGELOG.md","ref":"main","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md"},"format":"keep-a-changelog","releases":[{"version":"0.9.9","date":"2026-10-23","date_source":"heading","heading":"Version 0.9.9 - 2026-10-23","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md#version-099---2026-10-23","sections":[{"kind":"feature","heading":"Added","items":2},{"kind":"change","heading":"Changed","items":1},{"kind":"fix","heading":"Fixed","items":5}],"hash":"2eb4f75a5794c195"},{"version":"0.9.8","date":"2026-10-04","date_source":"heading","heading":"Version 0.9.8 - 2026-10-04","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md#version-098---2026-10-04","sections":[{"kind":"feature","heading":"Added","items":4},{"kind":"change","heading":"Changed","items":2},{"kind":"fix","heading":"Fixed","items":12}],"hash":"4b9df6f3c9f5dc63"},{"version":"0.9.7","date":"2026-09-23","date_source":"heading","heading":"Version 0.9.7 - 2026-09-23","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md#version-097---2026-09-23","sections":[{"kind":"feature","heading":"Added","items":3},{"kind":"fix","heading":"Fixed","items":3}],"hash":"597318fd565a53c5"},{"version":"0.9.6","date":"2026-09-17","date_source":"heading","heading":"Version 0.9.6 - 2026-09-17","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md#version-096---2026-09-17","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"15b952320554d805"},{"version":"0.9.5","date":"2026-09-16","date_source":"heading","heading":"Version 0.9.5 - 2026-09-16","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md#version-095---2026-09-16","sections":[{"kind":"feature","heading":"Added","items":2},{"kind":"change","heading":"Changed","items":2},{"kind":"fix","heading":"Fixed","items":6}],"hash":"a1bc56eb592aa11f"},{"version":"0.9.4","date":"2026-09-10","date_source":"heading","heading":"Version 0.9.4 - 2026-09-10","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md#version-094---2026-09-10","sections":[{"kind":"feature","heading":"Added","items":1},{"kind":"fix","heading":"Fixed","items":5}],"hash":"d1b19a3cb344c90b"},{"version":"0.9.3","date":"2026-09-04","date_source":"heading","heading":"Version 0.9.3 - 2026-09-04","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md#version-093---2026-09-04","sections":[{"kind":"feature","heading":"Added","items":2},{"kind":"change","heading":"Changed","items":3},{"kind":"fix","heading":"Fixed","items":3}],"hash":"1345ae5fac5a7484"},{"version":"0.9.2","date":"2026-08-26","date_source":"heading","heading":"Version 0.9.2 - 2026-08-26","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md#version-092---2026-08-26","sections":[{"kind":"feature","heading":"Added","items":4},{"kind":"fix","heading":"Fixed","items":1}],"hash":"d3fc3ec1100c0671"},{"version":"0.9.1","date":"2026-08-14","date_source":"heading","heading":"Version 0.9.1 - 2026-08-14","url":"https://github.com/cap-js/agents/blob/main/CHANGELOG.md#version-091---2026-08-14","sections":[{"kind":"feature","heading":"Added","items":1}],"hash":"955492c926db47de"}],"versions":[{"version":"0.9.9","date":"2026-10-23"},{"version":"0.9.8","date":"2026-10-07"},{"version":"0.9.7","date":"2026-09-23"},{"version":"0.9.6","date":"2026-09-17"},{"version":"0.9.5","date":"2026-09-16"},{"version":"0.9.4","date":"2026-09-10"},{"version":"0.9.3","date":"2026-09-04"},{"version":"0.9.2","date":"2026-08-26"},{"version":"0.9.1","date":"2026-08-14"},{"version":"0.0.0","date":"2026-08-13"}],"crawled_at":"2026-10-25"},"edges":{"maintainers":[{"ref":"actor:cap-js","name":"SAP Cloud Application Programming Model","json":"/actors/cap-js.json"}],"contributors":[{"ref":"actor:anjan-poonacha","name":"Anjan","json":"/actors/anjan-poonacha.json"},{"ref":"actor:danjoa","name":"Daniel Hutzel","json":"/actors/danjoa.json"},{"ref":"actor:dellagustin-sap","name":"Guilherme Dellagustin","json":"/actors/dellagustin-sap.json"},{"ref":"actor:johannes-vogel","name":"Johannes Vogel","json":"/actors/johannes-vogel.json"},{"ref":"actor:akatuoro","name":"Johannes Vogt","json":"/actors/akatuoro.json"},{"ref":"actor:ignipae","name":"Julian Breuksch","json":"/actors/ignipae.json"},{"ref":"actor:lisajulia","name":"Lisa Julia Nebel","json":"/actors/lisajulia.json"},{"ref":"actor:madankumarpichamuthu","name":"madankumarpichamuthu","json":"/actors/madankumarpichamuthu.json"},{"ref":"actor:urfuwo","name":"Markus Riedinger","json":"/actors/urfuwo.json"},{"ref":"actor:schiwekm","name":"Marten Schiwek","json":"/actors/schiwekm.json"},{"ref":"actor:maxieckert-sap","name":"Maximilian Eckert","json":"/actors/maxieckert-sap.json"},{"ref":"actor:sirsimon04","name":"Simon Engel","json":"/actors/sirsimon04.json"},{"ref":"actor:sjvans","name":"sjvans","json":"/actors/sjvans.json"},{"ref":"actor:stefanrudi","name":"Stefan Rudi","json":"/actors/stefanrudi.json"},{"ref":"actor:swaldmann","name":"Steffen Waldmann","json":"/actors/swaldmann.json"}],"explained_by":[{"ref":"content:cap-in-the-age-of-ai-5-agents-wrap-up","name":"CAP in the age of AI #5 - agents wrap-up","json":"/content/cap-in-the-age-of-ai-5-agents-wrap-up.json"},{"ref":"content:cap-in-the-age-of-ai-4-more-on-agents","name":"CAP in the age of AI #4 - more on agents","json":"/content/cap-in-the-age-of-ai-4-more-on-agents.json"},{"ref":"content:cap-in-the-age-of-ai-3-from-mcp-to-a2a","name":"CAP in the age of AI #3 - from MCP to A2A","json":"/content/cap-in-the-age-of-ai-3-from-mcp-to-a2a.json"},{"ref":"content:cap-in-the-age-of-ai","name":"CAP in the age of AI","json":"/content/cap-in-the-age-of-ai.json"}],"alternative_to_this":[],"needed_by":[{"ref":"artifact:lemaiwo-cap-agent-ui5-webui","name":"cap-agent-ui5-webui","json":"/artifacts/lemaiwo-cap-agent-ui5-webui.json","requirement":"required","role":"agent runtime"},{"ref":"artifact:mi8y-cap-agents-sdm-reports-assistant","name":"Reports Assistant with SAP Document Management","json":"/artifacts/mi8y-cap-agents-sdm-reports-assistant.json","requirement":"required","role":"agent-framework"},{"ref":"artifact:kamilkov-supply-chain-rescue","name":"Supply Chain Rescue","json":"/artifacts/kamilkov-supply-chain-rescue.json","requirement":"conditional","role":"agent framework","condition":"the optional recovery agent or the Recall Agent is used"}],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}