Skip to content

Commit 3e197f3

Browse files
authored
Merge branch 'main' into feature/scratchpad-tool
2 parents a9a4fe3 + d4d2db1 commit 3e197f3

32 files changed

Lines changed: 941 additions & 775 deletions

File tree

docs/modules/backend.mdx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ import { ChatModelError } from "beeai-framework/backend/errors";
257257
import { OpenMeteoTool } from "beeai-framework/tools/weather/openMeteo";
258258

259259
const llm = new OpenAIChatModel(
260-
"gpt-4o",
260+
"gpt-5-nano",
261261
{},
262262
// {
263263
// baseURL: "OPENAI_BASE_URL",
@@ -269,13 +269,12 @@ const llm = new OpenAIChatModel(
269269

270270
llm.config({
271271
parameters: {
272-
temperature: 0,
273-
topP: 1,
272+
maxTokens: 2048,
274273
},
275274
});
276275

277276
async function openaiFromName() {
278-
const openaiLLM = await ChatModel.fromName("openai:gpt-4o");
277+
const openaiLLM = await ChatModel.fromName("openai:gpt-5-nano");
279278
const response = await openaiLLM.create({
280279
messages: [new UserMessage("what states are part of New England?")],
281280
});

docs/yarn.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5438,9 +5438,9 @@ __metadata:
54385438
linkType: hard
54395439

54405440
"lodash@npm:^4.17.21, lodash@npm:~4.17.21":
5441-
version: 4.17.21
5442-
resolution: "lodash@npm:4.17.21"
5443-
checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c
5441+
version: 4.17.23
5442+
resolution: "lodash@npm:4.17.23"
5443+
checksum: 10c0/1264a90469f5bb95d4739c43eb6277d15b6d9e186df4ac68c3620443160fc669e2f14c11e7d8b2ccf078b81d06147c01a8ccced9aab9f9f63d50dcf8cace6bf6
54445444
languageName: node
54455445
linkType: hard
54465446

python/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## python_v0.1.77 (2026-02-11)
2+
3+
### Features
4+
5+
- extend VectorStore parameters
6+
- update agentstack-sdk (#1405)
7+
18
## python_v0.1.76 (2026-01-20)
29

310
### Features

python/beeai_framework/adapters/agentstack/agents/agent.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,18 @@ async def _get_metadata(self, client: PlatformClient) -> dict[str, Any]:
152152

153153
context_token = await self._agent_stack_context.generate_token(
154154
client=client,
155-
grant_global_permissions=Permissions(llm={"*"}, embeddings={"*"}, a2a_proxy={"*"}, contexts={"read"}),
155+
grant_global_permissions=Permissions(
156+
llm={"*"},
157+
embeddings={"*"},
158+
a2a_proxy={"*"},
159+
contexts={"read"},
160+
model_providers={"read"},
161+
providers={"read"},
162+
),
156163
grant_context_permissions=ContextPermissions(files={"*"}, vector_stores={"*"}, context_data={"*"}),
157164
)
165+
client.headers["Authorization"] = f"Bearer {context_token.token.get_secret_value()}"
166+
158167
llm_spec = LLMServiceExtensionSpec.from_agent_card(self._agent.agent_card)
159168
embedding_spec = EmbeddingServiceExtensionSpec.from_agent_card(self._agent.agent_card)
160169
agent_stack_extension_spec = PlatformApiExtensionSpec.from_agent_card(self._agent.agent_card)

python/beeai_framework/adapters/agentstack/serve/_dummy_context_store.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
from collections.abc import AsyncIterator
5+
from uuid import UUID
56

67
try:
78
import a2a.types as a2a_types
@@ -23,6 +24,9 @@ async def load_history(self) -> AsyncIterator[a2a_types.Message | a2a_types.Arti
2324
async def store(self, data: a2a_types.Message | a2a_types.Artifact) -> None:
2425
pass
2526

27+
async def delete_history_from_id(self, from_id: UUID) -> None:
28+
pass
29+
2630

2731
class DummyContextStore(agentstack_context_store.ContextStore):
2832
_cs = DummyContextStoreInstance()

python/beeai_framework/adapters/agentstack/serve/factories.py

Lines changed: 10 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Copyright 2025 © BeeAI a Series of LF Projects, LLC
22
# SPDX-License-Identifier: Apache-2.0
3-
import uuid
43
from collections.abc import AsyncGenerator
54
from typing import Annotated, Any, Unpack, cast
65

@@ -87,17 +86,16 @@ async def run(
8786
embedding=extra_extensions.get("embedding"),
8887
extra_extensions=extra_extensions, # type: ignore[arg-type]
8988
) as stack_context:
90-
artifact_id = uuid.uuid4()
91-
append = False
89+
stream = False
9290

9391
@cloned_agent.emitter.on("partial_update")
9492
async def on_partial_update(data: ReActAgentUpdateEvent, _: EventMeta) -> None:
95-
nonlocal append
93+
nonlocal stream
9694
if data.update.key == "final_answer":
9795
update = data.update.value
9896
update = update.get_text_content() if hasattr(update, "get_text_content") else str(update)
99-
await _send_final_answer_update(context, artifact_id, update, append=append)
100-
append = True
97+
await context.yield_async(update)
98+
stream = True
10199

102100
@cloned_agent.emitter.on("update")
103101
async def on_update(data: ReActAgentUpdateEvent, _: EventMeta) -> None:
@@ -117,9 +115,7 @@ async def on_update(data: ReActAgentUpdateEvent, _: EventMeta) -> None:
117115
await context.store(message)
118116
await context.store(agent_response)
119117

120-
if append:
121-
await _send_final_answer_update(context, artifact_id, last_chunk=True)
122-
else:
118+
if not stream:
123119
yield agent_response
124120

125121
return agentstack_agent.agent(**agent_metadata)(run)
@@ -207,14 +203,13 @@ async def run(
207203
embedding=extra_extensions.get("embedding"),
208204
extra_extensions=extra_extensions, # type: ignore[arg-type]
209205
) as stack_context:
210-
artifact_id = uuid.uuid4()
211-
append = False
206+
stream = False
212207

213208
@cloned_agent.emitter.on("final_answer")
214209
async def on_final_answer(data: RequirementAgentFinalAnswerEvent, _: EventMeta) -> None:
215-
nonlocal append
216-
await _send_final_answer_update(context, artifact_id, data.delta, append=append)
217-
append = True
210+
nonlocal stream
211+
await context.yield_async(data.delta)
212+
stream = True
218213

219214
result = await cloned_agent.run([convert_a2a_to_framework_message(message)]).middleware(
220215
create_tool_trajectory_middleware(stack_context)
@@ -225,37 +220,12 @@ async def on_final_answer(data: RequirementAgentFinalAnswerEvent, _: EventMeta)
225220
await context.store(message)
226221
await context.store(agent_response)
227222

228-
if append:
229-
await _send_final_answer_update(context, artifact_id, last_chunk=True)
230-
else:
223+
if not stream:
231224
yield agent_response
232225

233226
return agentstack_agent.agent(**agent_metadata)(run)
234227

235228

236-
async def _send_final_answer_update(
237-
context: agentstack_context.RunContext,
238-
artifact_id: uuid.UUID,
239-
update: str = "",
240-
*,
241-
append: bool = True,
242-
last_chunk: bool = False,
243-
) -> None:
244-
await context.yield_async(
245-
a2a_types.TaskArtifactUpdateEvent(
246-
append=append,
247-
context_id=context.context_id,
248-
task_id=context.task_id,
249-
last_chunk=last_chunk,
250-
artifact=a2a_types.Artifact(
251-
name="final_answer",
252-
artifact_id=str(artifact_id),
253-
parts=[a2a_types.Part(root=a2a_types.TextPart(text=update))],
254-
),
255-
)
256-
)
257-
258-
259229
def _runnable_factory(
260230
runnable: Runnable[Any], *, metadata: AgentStackServerMetadata | None = None, memory_manager: MemoryManager
261231
) -> agentstack_agent.AgentFactory:

python/beeai_framework/adapters/langchain/backend/vector_store.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ def __init__(self, *, vector_store: LCVectorStore) -> None:
3030
super().__init__()
3131
self.vector_store: LCVectorStore = vector_store
3232

33-
async def add_documents(self, documents: list[Document]) -> list[str]:
33+
async def add_documents(self, documents: list[Document], **kwargs: Any) -> list[str]:
3434
lc_documents = [document_to_lc_document(document) for document in documents]
35-
return await self.vector_store.aadd_documents(lc_documents)
35+
return await self.vector_store.aadd_documents(lc_documents, **kwargs)
3636

3737
async def search(self, query: QueryLike, k: int = 4, **kwargs: Any) -> list[DocumentWithScore]:
3838
query_str = str(query)

python/beeai_framework/adapters/langchain/mappers/documents.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313

1414

1515
def lc_document_to_document(lc_document: Document) -> VectorStoreDocument:
16-
return VectorStoreDocument(content=lc_document.page_content, metadata=lc_document.metadata)
16+
return VectorStoreDocument(id=lc_document.id, content=lc_document.page_content, metadata=lc_document.metadata)
1717

1818

1919
def document_to_lc_document(document: VectorStoreDocument) -> Document:
20-
return Document(page_content=document.content, metadata=document.metadata)
20+
return Document(id=document.id, page_content=document.content, metadata=document.metadata)

python/beeai_framework/backend/types.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,14 +247,19 @@ class EmbeddingModelOutput(BaseModel):
247247

248248

249249
class Document(BaseModel):
250+
model_config = ConfigDict(extra="allow")
251+
252+
id: str | None = Field(default=None, coerce_numbers_to_str=True)
253+
metadata: dict[str, str | int | float | bool] = Field(default_factory=dict)
250254
content: str
251-
metadata: dict[str, str | int | float | bool]
252255

253256
def __str__(self) -> str:
254257
return self.content
255258

256259

257260
class DocumentWithScore(BaseModel):
261+
model_config = ConfigDict(extra="allow")
262+
258263
document: Document
259264
score: float
260265

python/beeai_framework/backend/vector_store.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class QueryLike(Protocol):
1717
Any object that implements the `__str__` method can be used as a query
1818
for vector store searches.
1919
"""
20+
2021
def __str__(self) -> str: ...
2122

2223

0 commit comments

Comments
 (0)