GenieTé Screens Python SDK — live visual output for AI agents (AgentScreen)
Project description
geniete-screens
Publish live status, metrics, terminal output, and viewer links from any AI agent or automation into an AgentScreen.
AgentScreen is a GenieTé service by Genie, Inc.. It is built for developers who want their own systems to stay simple and predictable while offloading live connectivity, session handling, and fair metered delivery to a service made by developers.
Limited Access
AgentScreen currently runs as a limited-access service. You need:
- a GenieTé account at
https://account.geniete.com/; - a screen created at
https://screens.geniete.com/; - credits granted by an administrator;
- a screen API key, shown once when the screen is created.
If your balance reaches zero, ask your administrator for more credits.
Install
pip install geniete-screens
or:
uv add geniete-screens
The import name is geniete_screens.
Quick Start
Create a screen in the AgentScreen console, copy the API key, and note the screen id.
from geniete_screens import Screen
screen = Screen(
api_key="as_key_...",
screen_id="scr_...",
)
screen.message("Agent booted", title="status", tone="success")
screen.metric("queue_depth", 12)
screen.terminal("$ python agent.py\nready\n")
The default base URL is:
https://screens.geniete.com
Override it only for local or staging tests:
screen = Screen(
api_key="as_key_...",
screen_id="scr_...",
base_url="https://staging.example.com",
)
Event Types
Message Card
screen.message(
"Fetched 42 candidate documents and selected 5 for synthesis.",
title="retrieval",
tone="info",
)
Tones: info, success, warning, error.
Metric
screen.metric("latency", 184, unit="ms")
screen.metric("tokens", 18342)
screen.metric("cost", "0.42", unit="credits")
Calling again with the same metric name updates it in place.
Terminal Output
screen.terminal("running eval suite...\n")
screen.terminal("pass 128/128\n")
Clear The Screen
screen.clear()
Viewer Links
Create a viewer link when you want another person or system to watch a screen.
url = screen.create_viewer_link(ttl_seconds=3600)
print(url)
The server enforces the maximum TTL allowed by the current plan.
Active Sessions
for session in screen.sessions():
print(session["session_id"], session.get("ip"))
screen.revoke_session("session_id_here")
Async Agents
Use AsyncScreen when your agent already runs in an async loop.
import asyncio
from geniete_screens import AsyncScreen
async def main():
screen = AsyncScreen(api_key="as_key_...", screen_id="scr_...")
await screen.message("Async agent started", tone="success")
await screen.metric("steps", 1)
sessions = await screen.sessions()
print(f"{len(sessions)} active viewers")
asyncio.run(main())
Long-Running Streaming Agents
For high-frequency agent output, use the WebSocket producer stream.
import asyncio
from geniete_screens import AsyncScreen
async def run_agent():
screen = AsyncScreen(api_key="as_key_...", screen_id="scr_...")
async with screen.stream() as stream:
await stream.message("planning")
await stream.terminal("tool: web_search\n")
await stream.metric("steps", 1)
await stream.message("done", tone="success")
asyncio.run(run_agent())
Use With Agent Frameworks
AgentScreen does not require a specific agent framework. If your agent can run Python code or call an HTTP endpoint, it can publish to a screen.
Generic Agent Loop
from geniete_screens import Screen
screen = Screen(api_key="as_key_...", screen_id="scr_...")
def on_step(step_name: str, detail: str):
screen.message(detail, title=step_name)
def on_tool_output(tool_name: str, output: str):
screen.terminal(f"$ {tool_name}\n{output}\n")
def on_score(name: str, value: float):
screen.metric(name, value)
LangChain, LlamaIndex, CrewAI, AutoGen, Or Custom Runners
Use the same pattern in the framework's callback, event handler, observer, or tool wrapper:
screen.message("tool call started", title="agent")
screen.terminal(tool_output)
screen.metric("retrieved_docs", len(documents))
Keep AgentScreen calls outside your critical decision path when possible. It is best used as live observability and customer-facing progress, not as part of the model's core reasoning state.
Shell, CI, Or Any HTTP Client
The SDK wraps this endpoint:
curl -X POST https://screens.geniete.com/public/api/publish \
-H "Authorization: Bearer $AGENTSCREEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"screen_id": "scr_...",
"event": {
"type": "content.message",
"title": "deploy",
"body": "release finished",
"tone": "success"
}
}'
Error Handling
httpx raises an exception for non-2xx responses. Common cases:
401: missing or invalid API key;403: key does not allow publish for this screen;404: screen not found;413: event payload too large;429: quota or credit exhaustion.
During limited access, a 429 usually means your account needs more credits
from an administrator.
Publish Order
When releasing public packages:
The MCP package depends on the SDK.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file geniete_screens-0.1.1.tar.gz.
File metadata
- Download URL: geniete_screens-0.1.1.tar.gz
- Upload date:
- Size: 5.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d589d751e33ed2ded8192fd64b7abae4b52266d25650582e4bc21a465e0e3316
|
|
| MD5 |
6ca0b8085b9b8d8d2c4deb8e6eba30c3
|
|
| BLAKE2b-256 |
ca5976882b9ea9b909738cf642ef8dc2d7ff7e7e59768a2c40cb04f0e3e92395
|
Provenance
The following attestation bundles were made for geniete_screens-0.1.1.tar.gz:
Publisher:
publish.yml on geniete/clients
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geniete_screens-0.1.1.tar.gz -
Subject digest:
d589d751e33ed2ded8192fd64b7abae4b52266d25650582e4bc21a465e0e3316 - Sigstore transparency entry: 2219859688
- Sigstore integration time:
-
Permalink:
geniete/clients@6c397f85ece07a940da5178547a67ff4ce10e37c -
Branch / Tag:
refs/tags/geniete-screens-v0.1.1 - Owner: https://github.com/geniete
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6c397f85ece07a940da5178547a67ff4ce10e37c -
Trigger Event:
push
-
Statement type:
File details
Details for the file geniete_screens-0.1.1-py3-none-any.whl.
File metadata
- Download URL: geniete_screens-0.1.1-py3-none-any.whl
- Upload date:
- Size: 6.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b0a98cbeb220e698d92dd6f775381c86ebb8e27482ebd671bb53d0262bbee79
|
|
| MD5 |
952544a1abc5ca15456574f1660bcca8
|
|
| BLAKE2b-256 |
ddf9038e312d2f4671f6060d74992fcc0565f9610cfb09f68ea51b2e03388de9
|
Provenance
The following attestation bundles were made for geniete_screens-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on geniete/clients
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geniete_screens-0.1.1-py3-none-any.whl -
Subject digest:
0b0a98cbeb220e698d92dd6f775381c86ebb8e27482ebd671bb53d0262bbee79 - Sigstore transparency entry: 2219859876
- Sigstore integration time:
-
Permalink:
geniete/clients@6c397f85ece07a940da5178547a67ff4ce10e37c -
Branch / Tag:
refs/tags/geniete-screens-v0.1.1 - Owner: https://github.com/geniete
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6c397f85ece07a940da5178547a67ff4ce10e37c -
Trigger Event:
push
-
Statement type: