-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsessions_loop.py
More file actions
134 lines (113 loc) · 4.43 KB
/
Copy pathsessions_loop.py
File metadata and controls
134 lines (113 loc) · 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
"""End-to-end agent-loop example — Create Agent + Environment + Session,
send a text prompt, stream events until the loop settles, print the
assistant's response.
Exercises the smallest useful call sequence:
POST /api/v3/agents (client.agents.create)
POST /api/v3/environments (client.environments.create)
POST /api/v3/sessions (client.sessions.create)
POST /api/v3/sessions/:id/events (client.sessions.events.send)
GET /api/v3/sessions/:id/events (stream) (client.sessions.events.stream)
Uses typed pydantic classes end-to-end on both send and receive so callers
get IDE completion + pyright/mypy field-name checks. Mirrors the Go SDK's
examples/sessions_loop/main.go 1:1.
export ARK_API_KEY=...
export ARK_MODEL_ID=doubao-seed-2-1-pro-260628
python examples/sessions_loop.py
"""
from __future__ import annotations
import os
import threading
import time
from arkruntime import Ark
from arkruntime.types.agent import ModelConfig, ToolItem
from arkruntime.types.environment import EnvConfig, NetworkingConfig
from arkruntime.types.session import (
ManagedAgentsAgentMessageEvent,
ManagedAgentsSessionErrorEvent,
ManagedAgentsSessionStatusIdleEvent,
ManagedAgentsSessionStatusTerminatedEvent,
ManagedAgentsTextBlock,
ManagedAgentsUserMessageEventParams,
)
STOP_EVENT_TYPES = (
ManagedAgentsSessionStatusIdleEvent,
ManagedAgentsSessionStatusTerminatedEvent,
ManagedAgentsSessionErrorEvent,
)
def main() -> None:
api_key = os.environ.get("ARK_API_KEY")
if not api_key:
raise SystemExit("set ARK_API_KEY")
model_id = os.environ.get("ARK_MODEL_ID", "${YOUR_MODEL_ID}")
client = Ark.volc(api_key=api_key)
ag = client.agents.create(
name=f"example-loop-agent-{time.time_ns()}",
model=ModelConfig(id=model_id),
system="You are a helpful assistant. Answer the user's question briefly.",
tools=[ToolItem(type="agent_toolset_20260401")],
)
print(f"agent: id={ag.id}")
env = client.environments.create(
name=f"example-loop-env-{time.time_ns()}",
config=EnvConfig(
type="cloud",
networking=NetworkingConfig(type="unrestricted"),
),
)
print(f"env: id={env.id}")
sess = client.sessions.create(
agent=ag.id,
environment_id=env.id,
title="ark-runtime-python example loop",
)
print(f"session: id={sess.id}\n")
try:
# Open the SSE stream first, then send the user message asynchronously
# so we don't race and miss the earliest events.
def _send() -> None:
time.sleep(0.5) # Warmup so SSE is fully attached before we push.
client.sessions.events.send(
sess.id,
events=[
ManagedAgentsUserMessageEventParams(
type="user.message",
content=[
ManagedAgentsTextBlock(
type="text",
text="What's the tallest mountain? One sentence.",
)
],
)
],
)
threading.Thread(target=_send, daemon=True).start()
assistant_out: list[str] = []
for event in client.sessions.events.stream(sess.id):
ev = event.data
if ev is None:
continue
print(f"[EVT] {event.type}")
if isinstance(ev, ManagedAgentsAgentMessageEvent):
for block in ev.content:
if block.text:
assistant_out.append(block.text)
elif isinstance(ev, STOP_EVENT_TYPES):
break
joined = "".join(assistant_out).strip()
if joined:
print(f"\nassistant → {joined}")
else:
print("\n(no assistant text captured — check the [EVT] trace above)")
finally:
# Cleanup — delete session → env → agent.
for delete, obj_id in (
(client.sessions.delete, sess.id),
(client.environments.delete, env.id),
(client.agents.delete, ag.id),
):
try:
delete(obj_id)
except Exception as exc: # noqa: BLE001
print(f"cleanup {delete.__qualname__}({obj_id}): {exc}")
if __name__ == "__main__":
main()