Skip to content

Commit 9093294

Browse files
committed
fixup! fix: code review
Signed-off-by: Petr Bulánek <[email protected]>
1 parent 2d6faea commit 9093294

File tree

8 files changed

+35
-26
lines changed

8 files changed

+35
-26
lines changed

agents/form/src/form/agent.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import os
55
from typing import Annotated
6-
6+
from pydantic import BaseModel
77

88
import a2a.server.agent_execution
99
import a2a.server.apps
@@ -20,17 +20,20 @@
2020
from agentstack_sdk.server.context import RunContext
2121

2222
import agentstack_sdk.a2a.extensions
23-
from agentstack_sdk.a2a.extensions.ui.form import (
23+
from agentstack_sdk.a2a.extensions.common.form import (
2424
DateField,
2525
TextField,
2626
FileField,
27+
FileInfo,
2728
CheckboxField,
2829
MultiSelectField,
2930
OptionItem,
30-
FormExtensionServer,
31-
FormExtensionSpec,
3231
FormRender,
3332
)
33+
from agentstack_sdk.a2a.extensions.services.form import (
34+
FormServiceExtensionServer,
35+
FormServiceExtensionSpec,
36+
)
3437

3538
agent_detail_extension_spec = agentstack_sdk.a2a.extensions.AgentDetailExtensionSpec(
3639
params=agentstack_sdk.a2a.extensions.AgentDetail(
@@ -65,18 +68,24 @@
6568
)
6669

6770
form_render = FormRender(
68-
id="adventure_form",
6971
title="Let’s go on an adventure",
7072
columns=2,
7173
fields=[location, date_from, date_to, notes, flexible, interests],
7274
)
73-
form_extension_spec = FormExtensionSpec(form_render)
75+
form_extension_spec = FormServiceExtensionSpec.demand(initial_form=form_render)
7476

7577
server = Server()
7678

79+
class FormData(BaseModel):
80+
location: str | None
81+
date_from: str | None
82+
date_to: str | None
83+
notes: list[FileInfo] | None
84+
flexible: bool | None
85+
interests: list[str] | None
7786

7887
@server.agent(
79-
name="Single-turn Form Agent",
88+
name="Single-turn Form Agent 2",
8089
documentation_url=f"https://github.com/i-am-bee/agentstack/blob/{os.getenv('RELEASE_VERSION', 'main')}/agents/form",
8190
version="1.0.0",
8291
default_input_modes=["text", "text/plain"],
@@ -97,17 +106,17 @@
97106
],
98107
)
99108
async def agent(
100-
input: Message,
109+
_message: Message,
101110
form: Annotated[
102-
FormExtensionServer,
111+
FormServiceExtensionServer,
103112
form_extension_spec,
104113
],
105114
):
106115
"""Example demonstrating a single-turn agent using a form to collect user input."""
107116

108-
form_data = form.parse_form_response(message=input)
117+
form_data = form.parse_initial_form(model=FormData)
109118

110-
yield f"Hello {form_data.values['location'].value}"
119+
yield f"Hello {form_data.location}"
111120

112121

113122
def serve():

apps/agentstack-sdk-ts/src/client/a2a/extensions/common/form.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ export const formRenderSchema = z.object({
117117
fields: z.array(fieldSchema).nonempty(),
118118
});
119119

120-
export const responseSchema = z.object({
120+
export const formResponseSchema = z.object({
121121
values: z.record(
122122
z.string(),
123123
z.discriminatedUnion('type', [
@@ -141,4 +141,4 @@ export type MultiSelectField = z.infer<typeof multiSelectField>;
141141
export type CheckboxField = z.infer<typeof checkboxField>;
142142

143143
export type FormField = z.infer<typeof fieldSchema>;
144-
export type FormResponseValue = z.infer<typeof responseSchema>['values'][string];
144+
export type FormResponseValue = z.infer<typeof formResponseSchema>['values'][string];

apps/agentstack-sdk-ts/src/client/a2a/extensions/handle-agent-card.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export const handleAgentCard = (agentCard: { capabilities: AgentCapabilities })
6464
const formDemands = formExtensionExtractor(extensions);
6565

6666
const resolveMetadata = async (fulfillments: Fulfillments) => {
67-
let fulfilledMetadata = {};
67+
let fulfilledMetadata: Record<string, unknown> = {};
6868

6969
fulfilledMetadata = platformApiExtension(fulfilledMetadata, fulfillments.getContextToken());
7070

apps/agentstack-sdk-ts/src/client/a2a/extensions/handle-input-required.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import type { FormResponseValue } from './common/form';
77
import { requestFormExtension } from './ui/request-form';
88

9-
export type RunFormValues = Record<string, FormResponseValue>;
10-
119
export type InputRequiredResponses = Partial<{
1210
form: Record<string, FormResponseValue>;
1311
}>;

apps/agentstack-sdk-ts/src/client/a2a/extensions/services/form.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { z } from 'zod';
77

8-
import { formRenderSchema, responseSchema } from '../common/form';
8+
import { formRenderSchema, formResponseSchema } from '../common/form';
99
import type { A2AServiceExtension } from '../types';
1010

1111
const URI = 'https://a2a-extensions.agentstack.beeai.dev/services/form/v1';
@@ -20,11 +20,11 @@ const formDemandSchema = z.object({
2020
export type FormDemands = z.infer<typeof formDemandSchema>;
2121

2222
const formFulfillmentSchema = z.object({
23-
form_fulfillments: z.record(z.string(), responseSchema),
23+
form_fulfillments: z.record(z.string(), formResponseSchema),
2424
});
2525
export type FormFulfillments = z.infer<typeof formFulfillmentSchema>;
2626

27-
export const formExtension: A2AServiceExtension<typeof URI, z.infer<typeof formDemandSchema>, FormFulfillments> = {
27+
export const formExtension: A2AServiceExtension<typeof URI, FormDemands, FormFulfillments> = {
2828
getDemandsSchema: () => formDemandSchema,
2929
getFulfillmentSchema: () => formFulfillmentSchema,
3030
getUri: () => URI,

apps/agentstack-sdk-ts/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export * from './client/a2a/extensions/types';
2222
export * from './client/a2a/extensions/ui/agent-detail';
2323
export * from './client/a2a/extensions/ui/citation';
2424
export * from './client/a2a/extensions/ui/oauth';
25+
export * from './client/a2a/extensions/ui/request-form';
2526
export * from './client/a2a/extensions/ui/settings';
2627
export * from './client/a2a/extensions/ui/trajectory';
2728
export * from './client/a2a/extensions/utils';

apps/agentstack-ui/src/modules/runs/contexts/agent-run/AgentRunProvider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ function AgentRunProvider({ agent, agentClient, children }: PropsWithChildren<Ag
201201
contextId,
202202
fulfillments,
203203
responses: {
204-
form: message.form?.response ?? undefined,
204+
form: message.form?.response,
205205
},
206206
taskId: fulfillmentsContext.taskId,
207207
});

docs/sdk/overview.mdx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,27 +53,28 @@ When you await a form request, execution pauses the task, allowing the user to f
5353

5454
```python
5555
from typing import Annotated
56-
from agentstack_sdk.a2a.extensions.ui.form import (
57-
FormExtensionServer,
58-
FormExtensionSpec,
56+
from agentstack_sdk.a2a.extensions.common.form import (
5957
FormRender,
6058
TextField
6159
)
60+
from agentstack_sdk.a2a.extensions.ui.request_form import (
61+
RequestFormExtensionServer,
62+
RequestFormExtensionSpec,
63+
)
6264

6365
@server.agent()
6466
async def form_agent(
6567
input: Message,
6668
context: RunContext,
67-
form: Annotated[FormExtensionServer, FormExtensionSpec(params=None)]
69+
request_form: Annotated[RequestFormExtensionServer, RequestFormExtensionSpec()]
6870
):
6971
"""Agent that pauses execution to request user input"""
7072
yield AgentMessage(text="I need some information from you.")
7173

7274
# Execution pauses here - task enters input_required state
7375
# User fills out the form in the UI
74-
form_data = await form.request_form(
76+
form_data = await request_form.request_form(
7577
form=FormRender(
76-
id="user_info",
7778
title="Please provide your details",
7879
fields=[
7980
TextField(id="name", label="Your Name"),

0 commit comments

Comments
 (0)