Skip to content

Commit f092bba

Browse files
committed
feat: updates for platform
Signed-off-by: Tomas Weiss <tomas.weiss2@gmail.com>
1 parent a4e2c84 commit f092bba

File tree

12 files changed

+697
-437
lines changed

12 files changed

+697
-437
lines changed

.env.example

Lines changed: 0 additions & 18 deletions
This file was deleted.

.github/workflows/build-agent.yaml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: Build and Push Agent Image
2+
3+
on:
4+
push:
5+
tags:
6+
- 'release-*'
7+
8+
jobs:
9+
build:
10+
runs-on: ubuntu-latest
11+
permissions:
12+
contents: read
13+
packages: write
14+
15+
steps:
16+
- name: Checkout code
17+
uses: actions/checkout@v3
18+
19+
- name: Set up Python environment
20+
uses: actions/setup-python@v4
21+
with:
22+
python-version: '3.x'
23+
24+
- name: Install BeeAI CLI
25+
run: pip install beeai-cli
26+
27+
- name: Login to GitHub Container Registry
28+
uses: docker/login-action@v2
29+
with:
30+
registry: ghcr.io
31+
username: ${{ github.actor }}
32+
password: ${{ secrets.GITHUB_TOKEN }}
33+
34+
- name: Set up Docker
35+
uses: docker/setup-docker-action@v4
36+
with:
37+
daemon-config: '{"features": {"containerd-snapshotter": true}}'
38+
39+
- name: Set up Docker Buildx
40+
uses: docker/setup-buildx-action@v3
41+
42+
- name: Extract version from tag
43+
id: extract_version
44+
run: |
45+
# Extract version from tag (e.g., release-1.2.3 -> 1.2.3)
46+
VERSION=${GITHUB_REF#refs/tags/release-}
47+
echo "version=$VERSION" >> $GITHUB_OUTPUT
48+
49+
- name: Build and Push
50+
run: |
51+
beeai build ./ --tag ghcr.io/${{ github.repository }}/my-agent:${{ steps.extract_version.outputs.version }} --no-import --multi-platform --push

Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM python:3.13-bookworm
2+
COPY --from=ghcr.io/astral-sh/uv:0.7.15 /uv /bin/
3+
4+
ENV UV_LINK_MODE=copy \
5+
PRODUCTION_MODE=true
6+
7+
ADD . /app
8+
WORKDIR /app
9+
10+
RUN uv sync --no-cache --locked --link-mode copy
11+
12+
ENV PRODUCTION_MODE=True \
13+
PATH="/app/.venv/bin:$PATH" \
14+
HOME=/tmp
15+
16+
CMD ["uv", "run", "--no-sync", "server"]

pyproject.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ authors = [
88
license = {text = "Apache-2.0"}
99
requires-python = ">=3.11,<4.0"
1010
dependencies = [
11-
"beeai-framework[beeai-platform]>=0.1.44",
11+
"beeai-framework[beeai-platform]>=0.1.52",
1212
"aiohttp>=3.8.0",
1313
"mcp>=1.0.0",
1414
"python-dotenv>=1.0.0",
1515
"openinference-instrumentation-beeai>=0.1.10",
16-
"beeai-sdk>=0.3.1"
16+
"beeai-sdk>=0.3.5-rc4",
17+
"pydantic>=2.11.9",
1718
]
1819

1920
[project.optional-dependencies]

src/agents/agent_analyst.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@
44
from beeai_framework.agents.experimental.requirements.conditional import ConditionalRequirement
55
from beeai_framework.middleware.trajectory import GlobalTrajectoryMiddleware
66
from beeai_framework.tools import Tool
7+
from agents.session_context import SessionContext
8+
from agents.utils import ToolNotFoundError, get_tools_by_names, create_repo_scoped_tool
79

8-
from agents.utils import ToolNotFoundError, get_tools_by_names, llm, session_manager, create_repo_scoped_tool
910

10-
11-
async def get_agent_analyst():
11+
async def get_agent_analyst(session_context: SessionContext):
1212
"""Create and configure the duplicate issue analyzer agent."""
13-
tools = await session_manager.get_tools()
13+
tools = await session_context.get_tools()
1414
tool_names = ["get_issue", "list_issues", "search_issues"]
1515

1616
try:
1717
original_tools = await get_tools_by_names(tools, tool_names)
1818
# Create repo-scoped versions of all tools
1919
available_tools = []
2020
for tool in original_tools:
21-
scoped_tool = await create_repo_scoped_tool(tool)
21+
scoped_tool = await create_repo_scoped_tool(tool, session_context.get_repository())
2222
available_tools.append(scoped_tool)
2323
except ToolNotFoundError as e:
2424
raise RuntimeError(f"Failed to configure duplicate finder agent: {e}") from e
@@ -54,7 +54,7 @@ async def get_agent_analyst():
5454

5555
return RequirementAgent(
5656
name="Analyst",
57-
llm=llm,
57+
llm=session_context.get_llm(),
5858
role=role,
5959
instructions=instruction,
6060
tools=available_tools,

src/agents/agent_manager.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,27 @@
11
import json
2-
import os
32
from textwrap import dedent, indent
43

54
from beeai_framework.agents.experimental import RequirementAgent
65
from beeai_framework.agents.experimental.prompts import (
76
RequirementAgentSystemPromptInput,
8-
RequirementAgentTaskPromptInput,
97
)
10-
from beeai_framework.agents.experimental.requirements.ask_permission import AskPermissionRequirement
118
from beeai_framework.agents.experimental.requirements.conditional import ConditionalRequirement
9+
from beeai_framework.memory import BaseMemory
1210
from beeai_framework.middleware.trajectory import GlobalTrajectoryMiddleware
1311
from beeai_framework.template import PromptTemplate, PromptTemplateInput
1412
from beeai_framework.tools import Tool
1513
from beeai_framework.tools.handoff import HandoffTool
1614

1715
from agents.agent_analyst import get_agent_analyst
1816
from agents.agent_writer import get_agent_writer
17+
from agents.session_context import SessionContext
1918
from agents.simple_think import SimpleThinkTool
20-
from agents.utils import ToolNotFoundError, create_repo_scoped_tool, get_tools_by_names, llm, session_manager
19+
from agents.utils import ToolNotFoundError, create_repo_scoped_tool, get_tools_by_names
2120

2221

23-
async def get_agent_manager():
22+
async def get_agent_manager(session_context: SessionContext, memory: BaseMemory):
2423
"""Create and configure the issue workflow management agent."""
25-
tools = await session_manager.get_tools()
24+
tools = await session_context.get_tools()
2625

2726
try:
2827
tools = await get_tools_by_names(tools, ["create_issue", "list_issue_types"])
@@ -32,9 +31,9 @@ async def get_agent_manager():
3231

3332
for tool in tools:
3433
if tool.name == "create_issue":
35-
create_issue = await create_repo_scoped_tool(tool)
34+
create_issue = await create_repo_scoped_tool(tool, session_context.get_repository())
3635
elif tool.name == "list_issue_types":
37-
list_issue_types = await create_repo_scoped_tool(tool)
36+
list_issue_types = await create_repo_scoped_tool(tool, session_context.get_repository())
3837

3938
except ToolNotFoundError as e:
4039
raise RuntimeError(f"Failed to configure the agent: {e}") from e
@@ -55,13 +54,11 @@ async def get_agent_manager():
5554
issue_types_lines = [f"- {issue_type['name']}: {issue_type['description']}" for issue_type in issue_types_data]
5655
issue_types_text = indent("\n".join(issue_types_lines), " ")
5756

58-
repository = os.getenv("GITHUB_REPOSITORY")
59-
6057
role = "helpful coordinator"
6158
instruction = f"""\
6259
As the Coordinator, your responsibilities include routing tasks to experts, managing processes sequentially, and handling all user-facing communication. You do not perform technical writing or reasoning yourself.
6360
64-
You work in the following repository: {repository}
61+
You work in the following repository: {session_context.get_repository()}
6562
6663
## Operating Principles
6764
- Manage the full lifecycle of a GitHub issue from user request to creation.
@@ -113,8 +110,8 @@ async def get_agent_manager():
113110
"""
114111

115112
# Get the specialized agents
116-
writer = await get_agent_writer()
117-
analyst = await get_agent_analyst()
113+
writer = await get_agent_writer(session_context)
114+
analyst = await get_agent_analyst(session_context)
118115

119116
handoff_writer = HandoffTool(
120117
target=writer,
@@ -171,8 +168,9 @@ async def get_agent_manager():
171168

172169
return RequirementAgent(
173170
name="Project Manager",
174-
llm=llm,
171+
llm=session_context.get_llm(),
175172
role=role,
173+
memory=memory,
176174
instructions=instruction,
177175
tools=[
178176
SimpleThinkTool(),
@@ -182,7 +180,7 @@ async def get_agent_manager():
182180
],
183181
requirements=[
184182
ConditionalRequirement(SimpleThinkTool, force_at_step=1, force_after=[Tool], consecutive_allowed=False),
185-
AskPermissionRequirement(create_issue),
183+
# AskPermissionRequirement(create_issue),
186184
],
187185
templates={
188186
"system": PromptTemplate(PromptTemplateInput(schema=RequirementAgentSystemPromptInput, template=template)),

src/agents/agent_writer.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
from beeai_framework.agents.tool_calling import ToolCallingAgent
44
from beeai_framework.agents.tool_calling.prompts import ToolCallingAgentSystemPrompt, ToolCallingAgentTaskPrompt
55

6-
from agents.utils import fetch_content, llm
6+
from agents.session_context import SessionContext
7+
from agents.utils import fetch_content
78

89

910
async def get_template(template_type: str) -> str:
@@ -41,7 +42,7 @@ def _strip_yaml_frontmatter(content: str) -> str:
4142
return content
4243

4344

44-
async def get_agent_writer():
45+
async def get_agent_writer(session_context: SessionContext):
4546
"""Create and configure the technical issue writing agent."""
4647
# Get documentation content from environment variable
4748
docs_url = os.getenv("DOCS_URL")
@@ -140,7 +141,7 @@ async def get_agent_writer():
140141
141142
"""
142143

143-
clonedLlm = await llm.clone()
144+
clonedLlm = await session_context.get_llm().clone()
144145
clonedLlm.emitter.on("start", lambda data, event: data.input.tools.pop(0)) # removes the final answer tool
145146

146147
return ToolCallingAgent(

0 commit comments

Comments
 (0)