here-i-strand (HIS) agent module. Provides a custom Strands agent with DynamoDB status tracking, S3 session persistence and a concurrent tool executor with per-tool timeouts
Project description
Here I Strand
Library that provides a Strands agent for AWS Bedrock Agent Core with DynamoDB status tracking, S3 session persistence, and a concurrent tool executor with per-tool timeouts (HIS: here-i-strand).
Repository: github.com/tisaarus/here-i-strand
Installation
pip install here-i-strand
# or with uv
uv add here-i-strand
Quick start
You define how to load configuration (environment variables, your own settings module, etc.) and pass the values to HISAgent:
import os
from his import HISAgent
agent = HISAgent(
bucket_name=os.environ["BUCKET_NAME"],
status_dynamo_table_name=os.environ["STATUS_DYNAMO_TABLE_NAME"],
session_id="my-session-id",
name=os.environ.get("AGENT_NAME", "my-agent"),
agent_id=os.environ.get("AGENT_ID"), # Optional: unique identifier for the agent instance
tools=[...],
)
Configuration
The library does not provide a settings layer. Pass bucket_name, status_dynamo_table_name, session_id, and optionally name, agent_id (and any other HISAgent arguments) from your own config:
- Environment variables
- A
.envfile loaded by your app (e.g.python-dotenv,pydantic-settings) - Any other configuration source you use
Project structure (development)
here-i-strand/
├── README.md
├── pyproject.toml
├── .env.example # Example env vars (for your app)
│
├── his/ # Main package
│ ├── __init__.py # HISAgent, TimeoutConcurrentToolExecutor, event_loop_tracker, ping_status_task, write_dynamo
│ ├── his.py # HISAgent, TimeoutConcurrentToolExecutor, ping, event_loop_tracker, write_dynamo
│ └── logging/
│ └── logging.py
│
└── tests/
├── conftest.py
└── test_his.py
Main components
HISAgent: Strands agent with a DynamoDB ping thread and S3 sessions. You passstatus_dynamo_table_name,bucket_name,session_id, and optionallynameandagent_idso the ping and tracker use your table and bucket. Includes a default system prompt that enforces DynamoDB status reporting at key milestones. Thewrite_dynamotool is automatically added to the agent's tools.TimeoutConcurrentToolExecutor: Tool executor with a per-invocation timeout (default: 300s); if a tool exceeds the limit, an error is returned and execution continues with the rest.event_loop_tracker: Callback that writes event-loop milestones (init_event_loop,result,force_stop) to DynamoDB along with session and agent identifiers, and stops the ping thread when the loop finishes.write_dynamo: Strands tool for writing custom event records to DynamoDB for agent tracking and observability. Automatically included inHISAgent. Each call creates a new append-only event item identified by a composite key (session_id,event_id).DEFAULT_DYNAMODB_REPORTING_PROMPT_TEMPLATE: Template for the default system prompt that instructs the agent to report status updates to DynamoDB at key milestones such asSTART,TOOLING,MODEL_INVOCATION,PROGRESS,COMPLETION, andERROR. The template is populated with the actualtable_name,session_id, andagent_idvalues when the agent is created and explicitly instructs the agent to keep this reporting completely invisible to the end user.HISBedrockThrottlingLogger: Hook provider that listens forModelThrottledExceptionevents and writesBEDROCK_THROTTLINGrecords to DynamoDB for observability, independent of the system prompt.
Default behavior
When you create an HISAgent, the following happens automatically:
- System prompt: The
DEFAULT_DYNAMODB_REPORTING_PROMPT_TEMPLATEis formatted with yourstatus_dynamo_table_name,session_id, andagent_idand prepended to any custom system prompt you provide. It instructs the agent to report status at key milestones (START,TOOLING,MODEL_INVOCATION,PROGRESS,COMPLETION,ERROR) while keeping this reporting hidden from the user. - Tools: The
write_dynamotool is automatically added to your tools list, enabling the agent to write status updates to DynamoDB. - Ping thread: A daemon thread starts that pings DynamoDB every 20 seconds with a "running" status until the agent completes.
- Event tracking: The
event_loop_trackercallback records event-loop milestones to DynamoDB. - Result enrichment: The
__call__method returns the standardAgentResultobject, enriched with amodel_idattribute (best-effort; may beNonefor model providers that do not expose an identifier).
DynamoDB status events and schema
The library expects a DynamoDB table where status and telemetry events are written in an append-only fashion:
- Partition key:
session_id(String) - Sort key:
event_id(String, UUID generated per event)
Each item also includes:
agent_id: Agent instance identifierevt_type: Event type (e.g.START,TOOLING,MODEL_INVOCATION,PROGRESS,BEDROCK_THROTTLING,COMPLETION,ERROR,PING,EVENT_LOOP,AGENT_STATS,RESULT)evt_message: Human-readable message describing the event or a JSON-encoded payloadevt_datetime: ISO datetime of when the event was recorded
Typical high-level event types written by the agent are:
START: Beginning of request processing.TOOLING: Before executing any external tool (includes tool name and purpose).MODEL_INVOCATION: Before invoking another model or sub-agent.PROGRESS: Significant progress or intermediate result checkpoints.BEDROCK_THROTTLING: Bedrock throttling errors (rate/concurrency limits), including retry context.AGENT_STATS: Aggregated usage metrics for the invocation (tokens, cache usage, user).RESULT: Final structured result of the agent run, stored as JSON when possible (falls back to a{"raw": "<text>"}wrapper when parsing fails).COMPLETION: Successful end of processing.ERROR: Unexpected errors with details for debugging.
Tests
uv sync --all-groups
uv run pytest tests/ -v
Authors
License
MIT. See LICENSE.
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 here_i_strand-0.2.9.tar.gz.
File metadata
- Download URL: here_i_strand-0.2.9.tar.gz
- Upload date:
- Size: 16.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5f4037ca3bc18f7b88b6249f58c3e2ac9f023dafc7bf80dbdc7f4ae3b932cb6
|
|
| MD5 |
4a916ecc979b3f0d4cd48a8f83fb83c9
|
|
| BLAKE2b-256 |
5ec390065202c18f8069d0abd297fb3ca0b767b780d5346be2f5cda8d4fc6f24
|
File details
Details for the file here_i_strand-0.2.9-py3-none-any.whl.
File metadata
- Download URL: here_i_strand-0.2.9-py3-none-any.whl
- Upload date:
- Size: 13.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b6d43ac6b12376d912efd8712c46fb8aaa6d81c8c60791b462c44a7cf6be1b7
|
|
| MD5 |
f7bf17f57d5c922fd860178c5e6e6a71
|
|
| BLAKE2b-256 |
eb450a4ebfe1124a082e23300369b270d6c3306577245c07eb4bbc5703dd730b
|