{"version":3,"sources":["../../../../src/agents/experimental/streamlit/agent.ts"],"names":["StreamlitAgent","BaseAgent","emitter","Emitter","namespace","creator","input","meta","name","tools","description","memory","_run","_options","run","userMessage","runMemory","prepare","content","raw","llm","create","stream","messages","abortSignal","signal","observe","on","value","chunk","delta","getTextContent","emit","state","result","parse","assistantMessage","AssistantMessage","addMany","filter","isTruthy","message","systemMessage","SystemMessage","templates","system","StreamlitAgentSystemPrompt","render","prompt","isEmpty","UserMessage","createdAt","Date","inputMessages","TokenMemory","capacityThreshold","syncThreshold","handlers","removalSelector","msgs","prevConversationMsg","find","msg","includes","last","lastMsg","length","m","role","Role","ASSISTANT","AgentError","blocks","i","text","substring","code","findFirstPair","allowOverlap","push","start","end","inner","createSnapshot"],"mappings":"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","file":"agent.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AgentError, BaseAgent, BaseAgentRunOptions } from \"@/agents/base.js\";\nimport { AgentMeta } from \"@/agents/types.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { Callback, Emitter } from \"@/emitter/emitter.js\";\nimport { BaseMemory } from \"@/memory/base.js\";\nimport { isTruthy, last } from \"remeda\";\nimport { AssistantMessage, Message, Role, SystemMessage, UserMessage } from \"@/backend/message.js\";\nimport {\n  StreamlitAgentSystemPrompt,\n  StreamlitAgentTemplates,\n} from \"@/agents/experimental/streamlit/prompts.js\";\nimport { TokenMemory } from \"@/memory/tokenMemory.js\";\nimport { findFirstPair } from \"@/internals/helpers/string.js\";\nimport { ChatModel, ChatModelOutput } from \"@/backend/chat.js\";\n\nexport interface StreamlitAgentInput {\n  llm: ChatModel;\n  memory: BaseMemory;\n  templates?: Partial<StreamlitAgentTemplates>;\n}\n\nexport interface StreamlitRunInput {\n  prompt: string | null;\n}\n\ninterface Block {\n  name: \"text\" | \"app\";\n  content: string;\n  start: number;\n  end: number;\n}\n\ninterface Result {\n  raw: string;\n  blocks: Block[];\n}\n\nexport interface StreamlitRunOutput {\n  result: Result;\n  message: Message;\n  memory: BaseMemory;\n}\n\nexport interface StreamlitEvents {\n  newToken: Callback<{\n    delta: string;\n    state: Readonly<{\n      content: string;\n    }>;\n    chunk: ChatModelOutput;\n  }>;\n}\n\nexport class StreamlitAgent extends BaseAgent<StreamlitRunInput, StreamlitRunOutput> {\n  public emitter = new Emitter<StreamlitEvents>({\n    namespace: [\"agent\", \"experimental\", \"streamlit\"],\n    creator: this,\n  });\n\n  constructor(protected readonly input: StreamlitAgentInput) {\n    super();\n  }\n\n  public get meta(): AgentMeta {\n    return {\n      name: `Streamlit`,\n      tools: [],\n      description: `StreamlitAgent is an experimental meta-app agent that uses \\`Meta LLaMa 3.1 70B\\` to build \\`IBM Granite 3 8B\\`-powered apps using Streamlit -- a simple UI framework for Python.`,\n    };\n  }\n\n  set memory(memory: BaseMemory) {\n    this.input.memory = memory;\n  }\n\n  public get memory() {\n    return this.input.memory;\n  }\n\n  protected async _run(\n    input: StreamlitRunInput,\n    _options: BaseAgentRunOptions,\n    run: GetRunContext<typeof this>,\n  ): Promise<StreamlitRunOutput> {\n    const { userMessage, runMemory } = await this.prepare(input);\n\n    let content = \"\";\n    const raw = await this.input.llm\n      .create({\n        stream: true,\n        messages: runMemory.messages,\n        abortSignal: run.signal,\n      })\n      .observe((emitter) => {\n        emitter.on(\"newToken\", async ({ value: chunk }) => {\n          const delta = chunk.getTextContent();\n          if (delta) {\n            content += delta;\n            await run.emitter.emit(\"newToken\", { delta, state: { content }, chunk });\n          }\n        });\n      });\n    const result = this.parse(content || raw.getTextContent());\n\n    const assistantMessage = new AssistantMessage(content);\n    await this.memory.addMany([userMessage, assistantMessage].filter(isTruthy));\n\n    return {\n      result,\n      message: assistantMessage,\n      memory: runMemory,\n    };\n  }\n\n  protected async prepare(input: StreamlitRunInput) {\n    const systemMessage = new SystemMessage(\n      (this.input.templates?.system ?? StreamlitAgentSystemPrompt).render({}),\n    );\n\n    const userMessage =\n      input.prompt !== null || this.memory.isEmpty()\n        ? new UserMessage(input.prompt ?? \"No message.\", { createdAt: new Date() })\n        : null;\n\n    const inputMessages = [...this.memory.messages, userMessage].filter(isTruthy);\n\n    const runMemory = new TokenMemory({\n      capacityThreshold: 0.85,\n      syncThreshold: 0.6,\n      handlers: {\n        removalSelector(msgs) {\n          // First we remove messages from the past conversations\n          const prevConversationMsg = msgs.find((msg) => inputMessages.includes(msg));\n          if (prevConversationMsg && prevConversationMsg !== last(inputMessages)) {\n            return prevConversationMsg;\n          }\n\n          const lastMsg = msgs.length > 3 && msgs.find((m) => m.role === Role.ASSISTANT);\n          if (!lastMsg) {\n            throw new AgentError(\"Cannot fit the current conversation into the context window!\");\n          }\n          return lastMsg;\n        },\n      },\n    });\n    await runMemory.addMany([systemMessage, ...inputMessages].filter(isTruthy));\n\n    return { runMemory, userMessage };\n  }\n\n  protected parse(raw: string): Result {\n    const blocks: Block[] = [];\n\n    for (let i = 0; i < raw.length; ) {\n      const text = raw.substring(i);\n\n      const code = findFirstPair(text, [\"```python-app\\n\", \"\\n```\"], { allowOverlap: true });\n      if (!code) {\n        blocks.push({ start: i, end: i + text.length, content: text, name: \"text\" });\n        break;\n      }\n\n      if (code.start > 0) {\n        blocks.push({\n          name: \"text\",\n          start: i,\n          end: i + code.start,\n          content: text.substring(0, code.start),\n        });\n      }\n      blocks.push({\n        name: \"app\",\n        content: code.inner,\n        start: i + code.start,\n        end: i + code.end,\n      });\n      i += code.end;\n    }\n\n    return {\n      raw,\n      blocks,\n    };\n  }\n\n  createSnapshot() {\n    return {\n      ...super.createSnapshot(),\n      input: this.input,\n    };\n  }\n}\n"]}