Skip to content

Commit c63b561

Browse files
committed
Merge branch 'heartbeat-1' of github.com:timl3136/cadence-python-client into heartbeat-1
2 parents 382548b + 9c6bf02 commit c63b561

File tree

4 files changed

+65
-19
lines changed

4 files changed

+65
-19
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from dataclasses import dataclass
2+
from typing import Any
3+
4+
from agents import Handoff
5+
from agents.run_context import RunContextWrapper
6+
7+
8+
@dataclass
9+
class CadenceHandoff:
10+
"""Serializable representation of a Handoff for crossing the Cadence activity boundary.
11+
Only the fields needed by the model (tool schema) are kept; callable/runtime
12+
fields are reconstructed with no-op stubs on the activity side."""
13+
14+
tool_name: str
15+
tool_description: str
16+
input_json_schema: dict[str, Any]
17+
agent_name: str
18+
strict_json_schema: bool = True
19+
20+
21+
def to_cadence_handoff(handoff: Handoff[Any, Any]) -> CadenceHandoff:
22+
return CadenceHandoff(
23+
tool_name=handoff.tool_name,
24+
tool_description=handoff.tool_description,
25+
input_json_schema=handoff.input_json_schema,
26+
agent_name=handoff.agent_name,
27+
strict_json_schema=handoff.strict_json_schema,
28+
)
29+
30+
31+
def from_cadence_handoff(ch: CadenceHandoff) -> Handoff[Any, Any]:
32+
async def noop_invoke(_ctx: RunContextWrapper[Any], _json: str):
33+
raise RuntimeError("Handoff invocation is handled by the runner, not the model")
34+
35+
return Handoff(
36+
tool_name=ch.tool_name,
37+
tool_description=ch.tool_description,
38+
input_json_schema=ch.input_json_schema,
39+
on_invoke_handoff=noop_invoke,
40+
agent_name=ch.agent_name,
41+
strict_json_schema=ch.strict_json_schema,
42+
)

cadence/contrib/openai/cadence_model.py

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import AsyncIterator, cast
1+
from typing import AsyncIterator
22
from agents import (
33
Model,
44
ModelSettings,
@@ -13,6 +13,7 @@
1313
from openai.types.responses import ResponsePromptParam
1414

1515
from cadence.contrib.openai.cadence_tool import to_cadence_tool
16+
from cadence.contrib.openai.cadence_handoff import to_cadence_handoff
1617
from cadence.contrib.openai.openai_activities import OpenAIActivities
1718

1819

@@ -39,21 +40,18 @@ async def get_response(
3940
run model inside cadence activity
4041
"""
4142
# cast needed: mypy can't infer R through ParamSpec with complex OpenAI union types
42-
return cast(
43-
ModelResponse,
44-
await self._openai_activities.invoke_model(
45-
model_name=self._model_name,
46-
system_instructions=system_instructions,
47-
input=input,
48-
model_settings=model_settings,
49-
tools=[to_cadence_tool(tool) for tool in tools],
50-
output_schema=output_schema,
51-
handoffs=handoffs,
52-
tracing=tracing,
53-
previous_response_id=previous_response_id,
54-
conversation_id=conversation_id,
55-
prompt=prompt,
56-
),
43+
return await self._openai_activities.invoke_model(
44+
model_name=self._model_name,
45+
system_instructions=system_instructions,
46+
input=input,
47+
model_settings=model_settings,
48+
tools=[to_cadence_tool(tool) for tool in tools],
49+
output_schema=output_schema,
50+
handoffs=[to_cadence_handoff(h) for h in handoffs],
51+
tracing=tracing,
52+
previous_response_id=previous_response_id,
53+
conversation_id=conversation_id,
54+
prompt=prompt,
5755
)
5856

5957
def stream_response(
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import cadence
2+
from cadence.contrib.openai import OpenAIActivities
3+
4+
5+
cadence_registry = cadence.Registry()
6+
cadence_registry.register_activities(OpenAIActivities())

cadence/contrib/openai/openai_activities.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
TResponseInputItem,
77
ModelSettings,
88
AgentOutputSchemaBase,
9-
Handoff,
109
ModelTracing,
1110
ModelResponse,
1211
)
1312

1413
from cadence.contrib.openai.cadence_tool import CadenceTool, from_cadence_tool
14+
from cadence.contrib.openai.cadence_handoff import CadenceHandoff, from_cadence_handoff
1515

1616

1717
class OpenAIActivities:
@@ -29,7 +29,7 @@ async def invoke_model(
2929
model_settings: ModelSettings,
3030
tools: list[CadenceTool],
3131
output_schema: AgentOutputSchemaBase | None,
32-
handoffs: list[Handoff],
32+
handoffs: list[CadenceHandoff],
3333
tracing: ModelTracing,
3434
previous_response_id: str | None,
3535
conversation_id: str | None,
@@ -43,7 +43,7 @@ async def invoke_model(
4343
model_settings=model_settings,
4444
tools=[from_cadence_tool(tool) for tool in tools],
4545
output_schema=output_schema,
46-
handoffs=handoffs,
46+
handoffs=[from_cadence_handoff(h) for h in handoffs],
4747
tracing=tracing,
4848
previous_response_id=previous_response_id,
4949
conversation_id=conversation_id,

0 commit comments

Comments
 (0)