{"ref":"artifact:marianfoo-custom-llm-client","page":"/artifacts/marianfoo-custom-llm-client","json":"/artifacts/marianfoo-custom-llm-client.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"marianfoo-custom-llm-client","name":"custom-llm-client","artifact_type":"sample","ecosystem":"cap","flavors":[{"key":"node","source":{"url":"https://github.com/marianfoo/custom-llm-client","title":"marianfoo/custom-llm-client — README","checked":"2026-09-25","quote":"Brief, local-first proof-of-concept that combines SAP CAP (Node.js), LangGraph, and Model Context Protocol (MCP) to answer SAP questions via a chat UI."}}],"domain":"ai-and-agents","origin_ring":"independent","use_as":"starting-point","description":{"one_line":"A local-first proof-of-concept chat client for SAP questions: a CAP backend runs a LangGraph planner over MCP servers and streams the answer with every tool call shown as it runs.","short":"Local chat client for SAP questions with a CAP LangGraph backend","what_it_solves":"Where something is documented, whether an SAP Note covers it and what a system actually holds are three searches in three places. This puts them behind one chat: a CAP backend opens a [WebSocket](capability:websocket), a LangGraph planner decides which MCP tool to call, and the reply streams back with each call shown as it starts and completes. Which servers exist is `backend/mcp.servers.json`, shipped with placeholder entries for SAP documentation, SAP Notes, a local ADT server, S/4HANA OData services and a CAP service, and the model behind it is an environment variable: Azure OpenAI, the OpenAI API, Ollama or [SAP AI Core](artifact:btp-ai-core). Its README carries the author's own caution that this \"was a research project for a PoC and works barely\", and points to [local-llm-client-for-sap-consultants-librechat](https://github.com/marianfoo/local-llm-client-for-sap-consultants-librechat) in its place."},"links":{"repo":"https://github.com/marianfoo/custom-llm-client"},"compat":{"runtimes":["node"]},"type_properties":{"form":{"value":"reference-application","sources":[{"url":"https://github.com/marianfoo/custom-llm-client","title":"custom-llm-client — README","checked":"2026-10-18","quote":"Brief, local-first proof-of-concept that combines SAP CAP (Node.js), LangGraph, and Model Context Protocol (MCP) to answer SAP questions via a chat UI."}]}},"requires":[{"ref":"external:nodejs","for":"Running the CAP backend and the React frontend, at version 18 or higher as the README's prerequisites state.","sources":[{"url":"https://github.com/marianfoo/custom-llm-client","title":"marianfoo/custom-llm-client — README","checked":"2026-09-25","quote":"Prereqs: Node 18+, npm. Optional: Ollama (for fully local)."}]},{"ref":"external:langgraph","for":"The planner, act and respond loop that chooses which MCP tool to call on each turn and holds the state between them.","sources":[{"url":"https://github.com/marianfoo/custom-llm-client","title":"marianfoo/custom-llm-client — README","checked":"2026-09-25","quote":"Calls MCP servers (SAP Docs, SAP Notes, optional BTP) via a LangGraph planner → act → respond flow"}]},{"ref":"artifact:btp-ai-core","requirement":"conditional","condition":"LLM_PROVIDER is set to sap-ai-core; the README lists Azure OpenAI, the OpenAI API and Ollama as the other providers","for":"The model the chat calls, reached at a deployment's inference URL with a client id and secret, when SAP AI Core is the configured provider.","sources":[{"url":"https://github.com/marianfoo/custom-llm-client","title":"marianfoo/custom-llm-client — README","checked":"2026-09-25","quote":"Supports Azure OpenAI, OpenAI API, Ollama (local), and SAP AI Core (BTP). Not production-hardened."}]}],"demonstrates":["capability:agent-tooling","capability:llm-integration","capability:websocket"],"maintainers":["actor:marianfoo"],"drafted_with_ai":true,"provenance":{"discovered_via":[{"source":"source:github-orgs","channel":"marianfoo"}],"first_seen":"2026-09-25"},"contributors":["actor:marianfoo"]},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"one contributor, personally owned"},{"label":"Repository","tier":"fair","evidence":"pushed 2025-10, not archived"}],"compatibility":[{"label":"Declared for","tier":"fair","evidence":"nothing declared"},{"label":"Survived majors","tier":"unknown","evidence":"no release dates"},{"label":"Maintainer's CI","tier":"fair","evidence":"no CI configured"}],"practice":[{"label":"Tests","tier":"good","evidence":"1 test file"},{"label":"Docs","tier":"good","evidence":"docs/ with 1 page, README 6 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":2,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-26","npm":"not published under this name","stars":2,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2025-10-28","license_spdx":null,"org_owned":false,"default_branch":"main","created_at":"2025-10-28T14:18:50Z","open_prs":0,"tree_truncated":false,"test_files":1,"workflows":0,"other_ci":false,"readme_bytes":5983,"docs_files":1,"changelog":false,"license_file":false,"dts_files":1,"first_commit":"2025-10-28","last_commit":"2025-10-28","commits":1,"contributors":1,"readme_path":"README.md","readme_sha":"2860af15beb4f4fd7f40af2b1dfcbd1ad15af940","repo_read":"2026-10-26"},"edges":{"maintainers":[{"ref":"actor:marianfoo","name":"Marian Zeis","json":"/actors/marianfoo.json"}],"contributors":[{"ref":"actor:marianfoo","name":"Marian Zeis","json":"/actors/marianfoo.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}