diff --git a/.env.template b/.env.template
index 591f276d..c7590dfc 100644
--- a/.env.template
+++ b/.env.template
@@ -11,7 +11,7 @@ LOG_LEVEL=INFO
FASTAPI_HOST=0.0.0.0
FASTAPI_PORT=8000
# SESSION_PEERS_LIMIT=10
-# GET_CONTEXT_DEFAULT_MAX_TOKENS=2048
+# GET_CONTEXT_MAX_TOKENS=100000
# Embedding settings
# EMBED_MESSAGES=true
diff --git a/config.toml.example b/config.toml.example
index 9d23e4da..aa67f8df 100644
--- a/config.toml.example
+++ b/config.toml.example
@@ -9,7 +9,7 @@ LOG_LEVEL = "INFO"
FASTAPI_HOST = "0.0.0.0"
FASTAPI_PORT = 8000
SESSION_PEERS_LIMIT = 10
-GET_CONTEXT_DEFAULT_MAX_TOKENS = 2048
+GET_CONTEXT_MAX_TOKENS = 100000
EMBED_MESSAGES = true
MAX_EMBEDDING_TOKENS = 8192
MAX_EMBEDDING_TOKENS_PER_REQUEST = 300000
diff --git a/docs/v2/contributing/configuration.mdx b/docs/v2/contributing/configuration.mdx
index 8f4ed1fa..53814fc9 100644
--- a/docs/v2/contributing/configuration.mdx
+++ b/docs/v2/contributing/configuration.mdx
@@ -114,7 +114,7 @@ LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
FASTAPI_HOST=0.0.0.0
FASTAPI_PORT=8000
SESSION_PEERS_LIMIT=10
-GET_CONTEXT_DEFAULT_MAX_TOKENS=2048
+GET_CONTEXT_MAX_TOKENS=100000
# Embedding settings (optional)
EMBED_MESSAGES=false
diff --git a/docs/v2/documentation/core-concepts/summarizer.mdx b/docs/v2/documentation/core-concepts/summarizer.mdx
new file mode 100644
index 00000000..75fbabd8
--- /dev/null
+++ b/docs/v2/documentation/core-concepts/summarizer.mdx
@@ -0,0 +1,49 @@
+---
+title: 'Summarizer'
+description: 'How Honcho creates summaries of conversations'
+icon: 'code'
+---
+
+Almost all agents require, in addition to personalization and memory, a way to quickly prime a context window with a summary of the conversation (in Honcho, this is equivalent to a `session`). The general strategy for summarization is to combine a list of recent messages verbatim with a compressed LLM-generated summary of the older messages not included. Implementing this correctly, in such a way that the resulting context is:
+
+* Exhaustive: the combination of recent messages and summary should cover the entire conversation
+* Dynamically sized: the tokens used on both summary and recent messages should be malleable based on desired token usage
+* Performant: while creation of the summary by LLM introduces necessary latency, this should never add latency to an arbitrary end-user request
+
+...is a non-trivial problem. Summarization should not be necessary to re-implement for every new agent you build, so Honcho comes with a built-in solution.
+
+### Creating Summaries
+
+Honcho already has an asynchronous task queue for the purpose of deriving facts from messages. This is the ideal place to create summaries where they won't add latency to a message. Currently, Honcho has two configurable summary types:
+
+* Short summaries: by default, enqueued every 20 messages and given a token limit of 1000
+* Long summaries: by default, enqueued every 60 messages and given a token limit of 4000
+
+Both summaries are designed to be exhaustive: when enqueued, they are given the *prior* summary of their type plus every message after that summary. This recursive compression process naturally biases the summary towards recent messages while still covering the entire conversation.
+
+For example, if message 160 in a conversation triggers a short summary, as it would with default settings, the summary task would retrieve the prior short summary (message 140) plus messages 141-160. It would then produce a summary of messages 0-160 and store that in the short summary slot on the session. Every session has a single slot for each summary type: new summaries replace old ones.
+
+It's important to keep in mind that summary tasks run in the background and are not guaranteed to complete before the next message. However, they are guaranteed to complete in order, so that if a user saves 100 messages in a single batch, the short summary will first be created for messages 0-20, then 21-40, and so on, in our desired recursive way.
+
+### Retrieving Summaries
+
+Summaries are retrieved from the session by the `get_context` method. This method has two parameters:
+
+* `summary`: A boolean indicating whether to include the summary in the return type. The default is true.
+* `tokens`: An integer indicating the maximum number of tokens to use for the context. **If not provided, `get_context` will retrieve as many tokens as are required to create exhaustive conversation coverage.**
+
+The return type is simply a list of recent messages and a summary if the flag is used. These two components are dynamically sized based on the token limit. Combined, they will always be below the given token limit. Honcho reserves 60% of the context size for recent messages and 40% for the summary.
+
+There's a critical trade-off to understand between exhaustiveness and token usage. Let's go through some scenarios:
+
+* If the *last message* contains more tokens than the context token limit, no summary *or* message list is possible -- both will be empty.
+
+* If the *last few messages* contain more tokens than the context token limit, no summary is possible -- the context will only contain the last 1 or 2 messages that fit in the token limit.
+
+* If the summaries contain more tokens than the context token limit, no summary is possible -- the context will only contain the X most recent messages that fit in the token limit. Note that while summaries will often be smaller than their token limits, avoiding this scenario means passing a higher token limit than the Honcho-configured summary size(s). For this reason, the default token limit for `get_context` is a few times larger than the configured long summary size.
+
+The above scenarios indicate where summarization is not possible -- therefore, the context retrieved will almost certainly **not** be exhaustive.
+
+Sometimes, gaps in context aren't an issue. In these cases, it's best to pass a reasonable token limit depending on your needs. Other cases demand exhaustive context -- don't pass a token limit and just let Honcho retrieve the ideal combination of summary and recent messages. Finally, if you don't care about the conversation at large and just want the last few messages, set `summary` to false and `tokens` to some multiple of your desired message count. Note that context messages are not paginated, so there's a hard limit on the number of messages that can be retrieved (currently 100,000 tokens).
+
+As a final note, remember that summaries are generated asynchronously and therefore may not be available immediately. If you batch-save a large number of messages, assume that summaries will not be available until those messages are processed, which can take seconds to minutes depending on the number of messages and the configured LLM provider. Exhaustive `get_context` calls performed during this time will likely just return the messages in the session.
\ No newline at end of file
diff --git a/src/config.py b/src/config.py
index 86bae4ee..1cc8f453 100644
--- a/src/config.py
+++ b/src/config.py
@@ -174,7 +174,7 @@ class LLMSettings(HonchoSettings):
OPENAI_COMPATIBLE_BASE_URL: str | None = None
# General LLM settings
- DEFAULT_MAX_TOKENS: Annotated[int, Field(default=1000, gt=0, le=100000)] = 2500
+ DEFAULT_MAX_TOKENS: Annotated[int, Field(default=1000, gt=0, le=100_000)] = 2500
class DeriverSettings(HonchoSettings):
@@ -189,7 +189,7 @@ class DeriverSettings(HonchoSettings):
PROVIDER: Providers = "google"
MODEL: str = "gemini-2.5-flash"
- MAX_OUTPUT_TOKENS: Annotated[int, Field(default=2500, gt=0, le=100000)] = 2500
+ MAX_OUTPUT_TOKENS: Annotated[int, Field(default=2500, gt=0, le=100_000)] = 2500
# Thinking budget tokens are only applied when using Anthropic as provider
THINKING_BUDGET_TOKENS: Annotated[int, Field(default=1024, gt=0, le=5000)] = 1024
@@ -208,7 +208,7 @@ class DialecticSettings(HonchoSettings):
QUERY_GENERATION_PROVIDER: Providers = "groq"
QUERY_GENERATION_MODEL: str = "llama-3.1-8b-instant"
- MAX_OUTPUT_TOKENS: Annotated[int, Field(default=2500, gt=0, le=100000)] = 2500
+ MAX_OUTPUT_TOKENS: Annotated[int, Field(default=2500, gt=0, le=100_000)] = 2500
SEMANTIC_SEARCH_TOP_K: Annotated[int, Field(default=10, gt=0, le=100)] = 10
SEMANTIC_SEARCH_MAX_DISTANCE: Annotated[
@@ -228,10 +228,10 @@ class SummarySettings(HonchoSettings):
MESSAGES_PER_SHORT_SUMMARY: Annotated[int, Field(default=20, gt=0, le=100)] = 20
MESSAGES_PER_LONG_SUMMARY: Annotated[int, Field(default=60, gt=0, le=500)] = 60
- PROVIDER: Providers = "google"
- MODEL: str = "gemini-2.5-flash"
- MAX_TOKENS_SHORT: Annotated[int, Field(default=1000, gt=0, le=10000)] = 1000
- MAX_TOKENS_LONG: Annotated[int, Field(default=2000, gt=0, le=20000)] = 2000
+ PROVIDER: Providers = "openai"
+ MODEL: str = "gpt-4o-mini-2024-07-18"
+ MAX_TOKENS_SHORT: Annotated[int, Field(default=1000, gt=0, le=10_000)] = 1000
+ MAX_TOKENS_LONG: Annotated[int, Field(default=4000, gt=0, le=20_000)] = 4000
THINKING_BUDGET_TOKENS: Annotated[int, Field(default=512, gt=0, le=2000)] = 512
@@ -245,15 +245,17 @@ class AppSettings(HonchoSettings):
# Application-wide settings
LOG_LEVEL: str = "INFO"
FASTAPI_HOST: str = "0.0.0.0"
- FASTAPI_PORT: Annotated[int, Field(default=8000, gt=0, le=65535)] = 8000
+ FASTAPI_PORT: Annotated[int, Field(default=8000, gt=0, le=65_535)] = 8000
SESSION_PEERS_LIMIT: Annotated[int, Field(default=10, gt=0)] = 10
MAX_FILE_SIZE: Annotated[int, Field(default=5_242_880, gt=0)] = 5_242_880 # 5MB
- GET_CONTEXT_DEFAULT_MAX_TOKENS: Annotated[int, Field(default=2048, gt=0)] = 2048
+ GET_CONTEXT_MAX_TOKENS: Annotated[int, Field(default=100_000, gt=0, le=250_000)] = (
+ 100_000
+ )
EMBED_MESSAGES: bool = True
MAX_EMBEDDING_TOKENS: Annotated[int, Field(default=8192, gt=0)] = 8192
- MAX_EMBEDDING_TOKENS_PER_REQUEST: Annotated[int, Field(default=300000, gt=0)] = (
- 300000
+ MAX_EMBEDDING_TOKENS_PER_REQUEST: Annotated[int, Field(default=300_000, gt=0)] = (
+ 300_000
)
LANGFUSE_HOST: str | None = None
LANGFUSE_PUBLIC_KEY: str | None = None
diff --git a/src/crud/message.py b/src/crud/message.py
index 54ccc70b..c4de9c3e 100644
--- a/src/crud/message.py
+++ b/src/crud/message.py
@@ -2,7 +2,7 @@ from logging import getLogger
from typing import Any
from nanoid import generate as generate_nanoid
-from sqlalchemy import Select, func, select
+from sqlalchemy import ColumnElement, Select, func, select
from sqlalchemy.ext.asyncio import AsyncSession
from src import models, schemas
@@ -16,6 +16,43 @@ from .session import get_or_create_session
logger = getLogger(__name__)
+def _apply_token_limit(
+ base_conditions: list[ColumnElement[Any]], token_limit: int
+) -> Select[tuple[models.Message]]:
+ """
+ Helper function to apply token limit logic to a message query.
+
+ Creates a subquery that calculates running sum of tokens for most recent messages
+ and returns a select statement that joins with this subquery to limit results
+ based on token count.
+
+ Args:
+ base_conditions: List of conditions to apply to the base query
+ token_limit: Maximum number of tokens to include in the messages
+
+ Returns:
+ Select statement with token limit applied
+ """
+ # Create a subquery that calculates running sum of tokens for most recent messages
+ token_subquery = (
+ select(
+ models.Message.id,
+ func.sum(models.Message.token_count)
+ .over(order_by=models.Message.id.desc())
+ .label("running_token_sum"),
+ )
+ .where(*base_conditions)
+ .subquery()
+ )
+
+ # Select Message objects where running sum doesn't exceed token_limit
+ return (
+ select(models.Message)
+ .join(token_subquery, models.Message.id == token_subquery.c.id)
+ .where(token_subquery.c.running_token_sum <= token_limit)
+ )
+
+
async def create_messages(
db: AsyncSession,
messages: list[schemas.MessageCreate],
@@ -142,25 +179,8 @@ async def get_messages(
else:
stmt = stmt.order_by(models.Message.id.asc())
elif token_limit is not None:
- # Apply token limit logic
- # Create a subquery that calculates running sum of tokens for most recent messages
- token_subquery = (
- select(
- models.Message.id,
- func.sum(models.Message.token_count)
- .over(order_by=models.Message.id.desc())
- .label("running_token_sum"),
- )
- .where(*base_conditions)
- .subquery()
- )
-
- # Select Message objects where running sum doesn't exceed token_limit
- stmt = (
- select(models.Message)
- .join(token_subquery, models.Message.id == token_subquery.c.id)
- .where(token_subquery.c.running_token_sum <= token_limit)
- )
+ # Apply token limit logic using helper function
+ stmt = _apply_token_limit(base_conditions, token_limit)
stmt = apply_filter(stmt, models.Message, filters)
# Apply final ordering based on reverse parameter
@@ -186,13 +206,14 @@ async def get_messages_id_range(
session_name: str,
start_id: int = 0,
end_id: int | None = None,
+ token_limit: int | None = None,
) -> list[models.Message]:
"""
Get messages from a session by primary key ID range.
If end_id is not provided, all messages after and including start_id will be returned.
If start_id is not provided, start will be beginning of session.
- Note: list is *inclusive* of the end_id message.
+ Note: list is *inclusive* of the end_id message and start_id message.
Args:
db: Database session
@@ -206,17 +227,22 @@ async def get_messages_id_range(
"""
if start_id < 0 or (end_id is not None and (start_id >= end_id or end_id <= 0)):
return []
- stmt = (
- select(models.Message)
- .where(
- models.Message.workspace_name == workspace_name,
- )
- .where(models.Message.session_name == session_name)
- )
+
+ base_conditions = [
+ models.Message.workspace_name == workspace_name,
+ models.Message.session_name == session_name,
+ ]
if end_id:
- stmt = stmt.where(models.Message.id.between(start_id, end_id))
+ base_conditions.append(models.Message.id.between(start_id, end_id))
else:
- stmt = stmt.where(models.Message.id >= start_id)
+ base_conditions.append(models.Message.id >= start_id)
+
+ if token_limit:
+ # Apply token limit logic using helper function
+ stmt = _apply_token_limit(base_conditions, token_limit)
+ stmt = stmt.order_by(models.Message.id)
+ else:
+ stmt = select(models.Message).where(*base_conditions)
result = await db.execute(stmt)
return list(result.scalars().all())
diff --git a/src/dialectic/chat.py b/src/dialectic/chat.py
index faeac25f..f0880856 100644
--- a/src/dialectic/chat.py
+++ b/src/dialectic/chat.py
@@ -267,7 +267,6 @@ async def chat(
session_id=session_name,
tokens=context_window_size,
summary=True,
- force_new=False,
db=db,
)
logger.info(
diff --git a/src/routers/sessions.py b/src/routers/sessions.py
index 3e9d3fcc..93a1ee08 100644
--- a/src/routers/sessions.py
+++ b/src/routers/sessions.py
@@ -370,36 +370,31 @@ async def get_session_context(
session_id: str = Path(..., description="ID of the session"),
tokens: int | None = Query(
None,
- description="Number of tokens to use for the context. Includes summary if set to true",
+ le=config.settings.GET_CONTEXT_MAX_TOKENS,
+ description=f"Number of tokens to use for the context. Includes summary if set to true. If not provided, the context will be exhaustive (within {config.settings.GET_CONTEXT_MAX_TOKENS} tokens)",
),
summary: bool = Query(
True,
description="Whether or not to include a summary *if* one is available for the session",
),
- force_new: bool = Query(
- False,
- description="Whether or not the included summary should be generated on-the-fly in order to exhaustively cover the session history. The summary flag must be true for this to take effect.",
- ),
db: AsyncSession = db,
):
"""
- Produce a context object from the session. The caller provides a token limit which the entire context must fit into.
- To do this, we allocate 40% of the token limit to the summary, and 60% to recent messages -- as many as can fit.
- If the caller does not want a summary, we allocate all the tokens to recent messages.
- The default token limit if not provided is 2048.
+ Produce a context object from the session. The caller provides an optional token limit which the entire context must fit into.
+ If not provided, the context will be exhaustive (within configured max tokens). To do this, we allocate 40% of the token limit
+ to the summary, and 60% to recent messages -- as many as can fit. Note that the summary will usually take up less space than
+ this. If the caller does not want a summary, we allocate all the tokens to recent messages.
"""
- token_limit = tokens or config.settings.GET_CONTEXT_DEFAULT_MAX_TOKENS
+ token_limit = tokens or config.settings.GET_CONTEXT_MAX_TOKENS
summary_content = ""
messages_tokens = token_limit
+ messages_start_id = 0
if summary:
- if force_new:
- logger.warning("Exhaustive summary requested -- not currently available")
-
summary_tokens_limit = token_limit * 0.4
- latest_long_summary, latest_short_summary = await summarizer.get_both_summaries(
+ latest_short_summary, latest_long_summary = await summarizer.get_both_summaries(
db,
workspace_name=workspace_id,
session_name=session_id,
@@ -414,36 +409,35 @@ async def get_session_context(
if (
latest_long_summary
- and latest_long_summary["token_count"] <= summary_tokens_limit
+ and long_len <= summary_tokens_limit
and long_len > short_len
):
summary_content = latest_long_summary["content"]
messages_tokens = token_limit - latest_long_summary["token_count"]
+ messages_start_id = latest_long_summary["message_id"]
elif (
- latest_short_summary
- and latest_short_summary["token_count"] <= summary_tokens_limit
- and short_len > 0
+ latest_short_summary and short_len <= summary_tokens_limit and short_len > 0
):
summary_content = latest_short_summary["content"]
messages_tokens = token_limit - latest_short_summary["token_count"]
+ messages_start_id = latest_short_summary["message_id"]
else:
- logger.warning(
- "No summary available for get_context, returning empty string. long_summary_len: %s, short_summary_len: %s",
+ logger.info(
+ "No summary available for get_context call with token limit %s, returning empty string. long_summary_len: %s, short_summary_len: %s",
+ token_limit,
long_len,
short_len,
)
summary_content = ""
- # Get the recent messages to return verbatim
- messages_stmt = await crud.get_messages(
+ # Get the recent messages after summary to return verbatim
+ messages = await crud.get_messages_id_range(
+ db,
workspace_name=workspace_id,
session_name=session_id,
+ start_id=messages_start_id,
token_limit=messages_tokens,
)
- result = await db.execute(messages_stmt)
- messages = list(result.scalars().all())
-
- logger.info(f"Retrieved {len(messages)} recent messages for verbatim return")
return schemas.SessionContext(
name=session_id,
diff --git a/src/utils/summarizer.py b/src/utils/summarizer.py
index 42c647fc..e9c0a61f 100644
--- a/src/utils/summarizer.py
+++ b/src/utils/summarizer.py
@@ -10,6 +10,7 @@ from sqlalchemy import update
from sqlalchemy.ext.asyncio import AsyncSession
from src.config import settings
+from src.dependencies import tracked_db
from src.exceptions import ResourceNotFoundException
from src.utils.clients import honcho_llm_call
from src.utils.logging import accumulate_metric
@@ -53,6 +54,8 @@ __all__ = [
MESSAGES_PER_SHORT_SUMMARY = settings.SUMMARY.MESSAGES_PER_SHORT_SUMMARY
MESSAGES_PER_LONG_SUMMARY = settings.SUMMARY.MESSAGES_PER_LONG_SUMMARY
+SUMMARIES_KEY = "summaries"
+
# The types of summary to store in the session metadata
class SummaryType(Enum):
@@ -60,7 +63,6 @@ class SummaryType(Enum):
LONG = "honcho_chat_summary_long"
-# Mirascope functions for summaries
@honcho_llm_call(
provider=settings.SUMMARY.PROVIDER,
model=settings.SUMMARY.MODEL,
@@ -69,32 +71,44 @@ class SummaryType(Enum):
)
async def create_short_summary(
messages: list[models.Message],
+ input_tokens: int,
previous_summary: str | None = None,
):
+ # input_tokens indicates how many tokens the message list + previous summary take up
+ # we want to optimize short summaries to be smaller than the actual content being summarized
+ # so we ask the agent to produce a word count roughly equal to either the input, or the max
+ # size if the input is larger. the word/token ratio is roughly 4:3 so we multiply by 0.75.
+ # LLMs *seem* to respond better to getting asked for a word count but should workshop this.
+ output_words = int(min(input_tokens, settings.SUMMARY.MAX_TOKENS_SHORT) * 0.75)
+
+ if previous_summary:
+ previous_summary_text = previous_summary
+ else:
+ previous_summary_text = "There is no previous summary -- the messages are the beginning of the conversation."
+
return f"""
-You are a system that summarizes parts of a conversation to create a concise and accurate summary.
-Focus on capturing:
-1. Key facts and information shared
+You are a system that summarizes parts of a conversation to create a concise and accurate summary. Focus on capturing:
+
+1. Key facts and information shared (**Capture as many explicit facts as possible**)
2. User preferences, opinions, and questions
3. Important context and requests
4. Core topics discussed
-5. User's apparent emotional state
-It is very important that you clearly distinguish between each member of the conversation, and that only a user's literal words are attributed to them.
+If there is a previous summary, ALWAYS make your new summary inclusive of both it and the new messages, therefore capturing the ENTIRE conversation. Prioritize key facts across the entire conversation.
-Provide a concise, factual summary that captures the essence of the conversation.
-Your summary should be detailed enough to serve as context for future messages,
-but brief enough to be helpful.
+Provide a concise, factual summary that captures the essence of the conversation. Your summary should be detailed enough to serve as context for future messages, but brief enough to be helpful. Prefer a thorough chronological narrative over a list of bullet points.
Return only the summary without any explanation or meta-commentary.
+
+{previous_summary_text}
+
+
{_format_messages(messages)}
-
-{previous_summary or ""}
-
+Produce as thorough a summary as possible in {output_words} words or less.
"""
@@ -108,30 +122,40 @@ async def create_long_summary(
messages: list[models.Message],
previous_summary: str | None = None,
):
+ # the word/token ratio is roughly 4:3 so we multiply by 0.75.
+ # LLMs *seem* to respond better to getting asked for a word count but should workshop this.
+ output_words = int(settings.SUMMARY.MAX_TOKENS_LONG * 0.75)
+
+ if previous_summary:
+ previous_summary_text = previous_summary
+ else:
+ previous_summary_text = "There is no previous summary -- the messages are the beginning of the conversation."
+
return f"""
-You are a system that creates comprehensive summaries of conversations.
-Focus on capturing:
-1. Key facts and information shared
+You are a system that creates thorough, comprehensive summaries of conversations. Focus on capturing:
+
+1. Key facts and information shared (**Capture as many explicit facts as possible**)
2. User preferences, opinions, and questions
3. Important context and requests
4. Core topics discussed in detail
5. User's apparent emotional state and personality traits
6. Important themes and patterns across the conversation
-It is very important that you clearly distinguish between each member of the conversation, and that only a user's literal words are attributed to them.
+If there is a previous summary, ALWAYS make your new summary inclusive of both it and the new messages, therefore capturing the ENTIRE conversation. Prioritize key facts across the entire conversation.
-Provide a thorough and detailed summary that captures the essence of the conversation.
-Your summary should serve as a comprehensive record of the important information in this conversation.
+Provide a thorough and detailed summary that captures the essence of the conversation. Your summary should serve as a comprehensive record of the important information in this conversation. Prefer an exhaustive chronological narrative over a list of bullet points.
Return only the summary without any explanation or meta-commentary.
+
+{previous_summary_text}
+
+
{_format_messages(messages)}
-
-{previous_summary or ""}
-
+Produce as thorough a summary as possible in {output_words} words or less.
"""
@@ -164,8 +188,6 @@ async def summarize_if_needed(
if should_create_long and should_create_short:
async def create_long_summary():
- from src.dependencies import tracked_db
-
async with tracked_db("create_long_summary") as db_session:
await _create_and_save_summary(
db_session,
@@ -174,10 +196,14 @@ async def summarize_if_needed(
message_id,
SummaryType.LONG,
)
+ logger.info(
+ "Saved long summary for session %s covering up to message %s (%s in session)",
+ session_name,
+ message_id,
+ message_seq_in_session,
+ )
async def create_short_summary():
- from src.dependencies import tracked_db
-
async with tracked_db("create_short_summary") as db_session:
await _create_and_save_summary(
db_session,
@@ -186,13 +212,18 @@ async def summarize_if_needed(
message_id,
SummaryType.SHORT,
)
+ logger.info(
+ "Saved short summary for session %s covering up to message %s (%s in session)",
+ session_name,
+ message_id,
+ message_seq_in_session,
+ )
await asyncio.gather(
create_long_summary(),
create_short_summary(),
return_exceptions=True,
)
- logger.debug("Both long and short summaries created and saved successfully")
else:
# If only one summary needs to be created, run them individually
if should_create_long:
@@ -203,7 +234,12 @@ async def summarize_if_needed(
message_id,
SummaryType.LONG,
)
- logger.debug("Long summary created and saved successfully")
+ logger.info(
+ "Saved long summary for session %s covering up to message %s (%s in session)",
+ session_name,
+ message_id,
+ message_seq_in_session,
+ )
elif should_create_short:
await _create_and_save_summary(
db,
@@ -212,7 +248,12 @@ async def summarize_if_needed(
message_id,
SummaryType.SHORT,
)
- logger.debug("Short summary created and saved successfully")
+ logger.info(
+ "Saved short summary for session %s covering up to message %s (%s in session)",
+ session_name,
+ message_id,
+ message_seq_in_session,
+ )
async def _create_and_save_summary(
@@ -246,10 +287,15 @@ async def _create_and_save_summary(
end_id=message_id,
)
+ messages_tokens = sum([message.token_count for message in messages])
+ previous_summary_tokens = latest_summary["token_count"] if latest_summary else 0
+ input_tokens = messages_tokens + previous_summary_tokens
+
new_summary = await _create_summary(
messages=messages,
previous_summary_text=previous_summary_text,
summary_type=summary_type,
+ input_tokens=input_tokens,
)
await _save_summary(
@@ -270,8 +316,9 @@ async def _create_and_save_summary(
async def _create_summary(
messages: list[models.Message],
- previous_summary_text: str | None = None,
- summary_type: SummaryType = SummaryType.SHORT,
+ previous_summary_text: str | None,
+ summary_type: SummaryType,
+ input_tokens: int,
) -> Summary:
"""
Generate a summary of the provided messages using an LLM.
@@ -285,10 +332,12 @@ async def _create_summary(
A full summary of the conversation up to the last message
"""
+ response: llm.CallResponse | None = None
try:
- response: llm.CallResponse
if summary_type == SummaryType.SHORT:
- response = await create_short_summary(messages, previous_summary_text)
+ response = await create_short_summary(
+ messages, input_tokens, previous_summary_text
+ )
else:
response = await create_long_summary(messages, previous_summary_text)
@@ -298,6 +347,15 @@ async def _create_summary(
if response.usage
else len(response.content) // 4
)
+
+ # Detect potential issues with the summary
+ if not summary_text.strip():
+ logger.error(
+ "Generated summary is empty! This may indicate a token limit issue."
+ )
+
+ logger.info("Summary text: %s", summary_text)
+ logger.info("Summary size: %s tokens", summary_tokens)
except Exception:
logger.exception("Error generating summary!")
# Fallback to a basic summary in case of error
@@ -308,6 +366,22 @@ async def _create_summary(
)
summary_tokens = 50
+ accumulate_metric(
+ f"deriver_message_{messages[-1].id}",
+ f"{summary_type.name}_summary_input",
+ response.usage.input_tokens if response and response.usage else "unknown",
+ "tokens",
+ )
+
+ accumulate_metric(
+ f"deriver_message_{messages[-1].id}",
+ f"{summary_type.name}_summary_size",
+ response.usage.output_tokens
+ if response and response.usage
+ else f"{summary_tokens} (est.)",
+ "tokens",
+ )
+
return Summary(
content=summary_text,
message_id=messages[-1].id if messages else 0,
@@ -349,9 +423,9 @@ async def _save_summary(
# Use SQLAlchemy update() with PostgreSQL's || operator to properly merge JSONB
# We need to merge the new summary into the existing summaries structure
update_data = {}
- existing_summaries = session.internal_metadata.get("summaries", {})
+ existing_summaries = session.internal_metadata.get(SUMMARIES_KEY, {})
existing_summaries[label_value] = summary
- update_data["summaries"] = existing_summaries
+ update_data[SUMMARIES_KEY] = existing_summaries
stmt = (
update(models.Session)
@@ -365,13 +439,6 @@ async def _save_summary(
await db.execute(stmt)
await db.commit()
- logger.info(
- "Saved %s for session %s covering up to message %s",
- summary["summary_type"],
- session_name,
- summary["message_id"],
- )
-
async def get_summarized_history(
db: AsyncSession,
@@ -455,7 +522,7 @@ async def get_summary(
# If session doesn't exist, there's no summary to retrieve
return None
- summaries: dict[str, Summary] = session.internal_metadata.get("summaries", {})
+ summaries: dict[str, Summary] = session.internal_metadata.get(SUMMARIES_KEY, {})
if not summaries or summary_type.value not in summaries:
return None
return summaries[summary_type.value]
@@ -483,7 +550,7 @@ async def get_both_summaries(
# If session doesn't exist, there's no summary to retrieve
return None, None
- summaries: dict[str, Summary] = session.internal_metadata.get("summaries", {})
+ summaries: dict[str, Summary] = session.internal_metadata.get(SUMMARIES_KEY, {})
return summaries.get(SummaryType.SHORT.value), summaries.get(SummaryType.LONG.value)
diff --git a/tests/bench/run_tests.py b/tests/bench/run_tests.py
index 5d984920..2b698ece 100644
--- a/tests/bench/run_tests.py
+++ b/tests/bench/run_tests.py
@@ -493,7 +493,7 @@ Evaluate whether the actual response contains the core correct information from
print(f"\n get_context call #{i + 1}")
session_name = str(get_context_call["session"])
summary = get_context_call["summary"]
- max_tokens = get_context_call.get("max_tokens")
+ max_tokens: int | None = get_context_call.get("max_tokens")
session = honcho_client.session(id=session_name)
# Wait for deriver queue to be empty for this session
@@ -510,16 +510,16 @@ Evaluate whether the actual response contains the core correct information from
tokenizer = tiktoken.get_encoding("cl100k_base")
summary_tokens = len(tokenizer.encode(session_context.summary))
+ print(f" summary: {session_context.summary}")
+
got_tokens = summary_tokens
for message in session_context.messages:
got_tokens += message.token_count
-
- print(f" summary: {summary}")
print(f" max tokens: {max_tokens}")
print(
f" got token count: {got_tokens} (summary: {summary_tokens}, messages: {got_tokens - summary_tokens} in {len(session_context.messages)} messages)"
)
- if got_tokens > max_tokens:
+ if max_tokens and got_tokens > max_tokens:
all_queries_passed = False
# Determine if test passed (all queries and get_context calls must pass)
diff --git a/tests/bench/tests/long_summary.json b/tests/bench/tests/long_summary.json
new file mode 100644
index 00000000..3bb6986a
--- /dev/null
+++ b/tests/bench/tests/long_summary.json
@@ -0,0 +1,267 @@
+{
+ "sessions": {
+ "session1": {
+ "messages": [
+ {
+ "peer": "alice",
+ "content": "Hello, how are you?"
+ },
+ {
+ "peer": "bob",
+ "content": "I'm good, thank you!"
+ },
+ {
+ "peer": "alice",
+ "content": "I'm going to share some of my favorite numbers with you now."
+ },
+ {
+ "peer": "alice",
+ "content": "7"
+ },
+ {
+ "peer": "alice",
+ "content": "74"
+ },
+ {
+ "peer": "alice",
+ "content": "12"
+ },
+ {
+ "peer": "alice",
+ "content": "8"
+ },
+ {
+ "peer": "alice",
+ "content": "2"
+ },
+ {
+ "peer": "alice",
+ "content": "3"
+ },
+ {
+ "peer": "alice",
+ "content": "14"
+ },
+ {
+ "peer": "alice",
+ "content": "24"
+ },
+ {
+ "peer": "alice",
+ "content": "37"
+ },
+ {
+ "peer": "alice",
+ "content": "What's your favorite number?"
+ },
+ {
+ "peer": "bob",
+ "content": "7"
+ },
+ {
+ "peer": "alice",
+ "content": "Glad to hear it. Here's a bunch of Lorem Ipsum text I found on the internet: Lorem ipsum dolor sit amet, consectetur adipiscing elit."
+ },
+ {
+ "peer": "alice",
+ "content": "Vivamus sodales arcu ut dolor vulputate mollis. Nulla turpis elit, tempus vitae enim in, eleifend dictum dui. Fusce id vulputate augue. Morbi in elit elit. Fusce consectetur at odio lacinia elementum. Donec sed erat ante. Quisque ac massa lacus. Cras at sollicitudin magna. Donec auctor ut magna nec iaculis."
+ },
+ {
+ "peer": "alice",
+ "content": "Etiam tincidunt consequat convallis. Nulla metus ligula, semper ac nunc id, porttitor mattis augue. Sed imperdiet nunc vitae mauris fermentum pretium. Quisque quis massa non tortor ultricies rutrum cursus at augue. Ut porta pulvinar enim et pharetra. Etiam tincidunt dolor nisl, eu aliquet odio imperdiet vel."
+ },
+ {
+ "peer": "alice",
+ "content": "Suspendisse porttitor leo odio, sed viverra nisl facilisis vitae. Aliquam eleifend mollis porta. Integer pulvinar mollis tempus. Donec consectetur condimentum neque non auctor. Sed nec diam sapien. Suspendisse et pharetra mi. Vivamus venenatis pharetra nisl, vitae luctus lorem fringilla at."
+ },
+ {
+ "peer": "alice",
+ "content": "Nullam lobortis nibh eget magna semper, aliquet volutpat purus tempor. Integer aliquet eleifend nisl, in pretium nibh aliquam vitae. In posuere sodales purus, sit amet dapibus tortor sollicitudin ut. Nulla facilisi. Sed ligula nulla, facilisis eu ligula in, sodales hendrerit dui."
+ },
+ {
+ "peer": "alice",
+ "content": "Donec laoreet, nisl ut imperdiet tincidunt, magna nulla ultrices lectus, quis pulvinar erat enim vel magna. Aliquam vulputate auctor efficitur. Aenean vitae risus metus. Nulla varius condimentum volutpat. Aenean ligula enim, fermentum vel iaculis in, mollis non massa."
+ },
+ {
+ "peer": "alice",
+ "content": "Nulla maximus, nunc suscipit consequat condimentum, dolor ligula rhoncus quam, eu lacinia eros ex id nibh. Nam vitae ligula arcu. Ut a tellus sit amet libero fermentum vehicula. Cras sollicitudin nibh in odio convallis, vitae aliquam tellus dapibus."
+ },
+ {
+ "peer": "alice",
+ "content": "Etiam commodo ipsum aliquam diam maximus, vel tristique eros gravida. Integer viverra iaculis aliquet. Aliquam molestie enim quis mauris aliquet, et dictum velit rhoncus. Sed efficitur enim in ullamcorper ullamcorper. Vestibulum urna leo, tincidunt a lectus et, viverra pellentesque tortor. Aenean pretium tortor nunc, eget vehicula nulla sollicitudin et. Aliquam erat volutpat."
+ },
+ {
+ "peer": "bob",
+ "content": "Wow, that's a lot of text! Here's some Lorem Ipsum that I like: Lorem ipsum dolor sit amet, consectetur adipiscing elit."
+ },
+ {
+ "peer": "bob",
+ "content": "Donec tincidunt, sem sed volutpat tempor, nisl nulla congue elit, nec gravida mi velit nec felis. Mauris sit amet ultrices ipsum. Cras non velit at quam auctor congue quis sed sem."
+ },
+ {
+ "peer": "bob",
+ "content": "Quisque ut neque maximus quam ornare cursus eget vitae ipsum. Morbi elit mi, vulputate vel condimentum tincidunt, lobortis ut nulla. Nunc tortor enim, porta vitae posuere sit amet, rutrum vel purus."
+ },
+ {
+ "peer": "bob",
+ "content": "Integer tincidunt ipsum sem, et suscipit quam tempus vel. Vivamus rutrum nisi sed vestibulum congue. Maecenas laoreet imperdiet pulvinar. Vivamus vitae lobortis ex."
+ },
+ {
+ "peer": "bob",
+ "content": "Nullam vitae mattis elit, quis sodales magna. Nunc dolor nunc, scelerisque nec tellus at, finibus euismod mauris. Donec quis odio dui. In a dui libero."
+ },
+ {
+ "peer": "bob",
+ "content": "Mauris pellentesque felis sed eros porttitor, eget ultricies erat cursus. Morbi a viverra nulla, at hendrerit ipsum. Pellentesque eleifend, sapien id fringilla feugiat, massa justo bibendum ligula, sed condimentum elit ipsum ut nibh."
+ },
+ {
+ "peer": "bob",
+ "content": "In erat ipsum, consectetur nec turpis ut, finibus hendrerit lacus. Morbi elementum efficitur hendrerit. Fusce pellentesque dolor urna, quis luctus est tincidunt vitae."
+ },
+ {
+ "peer": "bob",
+ "content": "Maecenas imperdiet diam eu mi tempus sollicitudin. Maecenas luctus, est ut feugiat scelerisque, nisl diam mollis sem, non scelerisque mi ligula vel odio. Nulla aliquet orci non purus pellentesque, quis consectetur nulla ornare."
+ },
+ {
+ "peer": "bob",
+ "content": "Mauris euismod dui dapibus aliquet eleifend. Curabitur et quam dui. Phasellus nisi libero, cursus eget ultrices in, rutrum sit amet risus. Sed quam purus, ultricies nec varius porttitor, ullamcorper consectetur ex."
+ },
+ {
+ "peer": "bob",
+ "content": "Curabitur in quam in nulla ultricies sodales eget sit amet ligula. Aenean odio tellus, ullamcorper non sem non, cursus volutpat lectus. Nulla non nisl molestie, tempor sem sit amet, molestie tortor."
+ },
+ {
+ "peer": "bob",
+ "content": "Proin blandit elit a odio mollis tempus. Donec convallis sed leo at convallis. Integer ac magna posuere, convallis sapien tincidunt, efficitur sapien. Suspendisse ultrices auctor justo, vitae tempor nibh ullamcorper vel."
+ },
+ {
+ "peer": "bob",
+ "content": "Fusce molestie imperdiet ornare. Donec laoreet urna sed urna consectetur tempor. Aenean tempus vitae diam non venenatis. Sed in convallis erat. Ut non sodales nisi."
+ },
+ {
+ "peer": "bob",
+ "content": "Praesent euismod id massa eget vulputate. Suspendisse id molestie tortor. Duis ac pretium neque. Curabitur vulputate volutpat tellus, at dictum risus tincidunt quis."
+ },
+ {
+ "peer": "bob",
+ "content": "Nam pellentesque sed elit eget sollicitudin. Proin vestibulum efficitur risus, eget tempus sapien posuere eu. In porta nec nisl sed iaculis. Integer a elementum risus."
+ },
+ {
+ "peer": "bob",
+ "content": "Nam sem ex, dignissim sit amet ante at, posuere tristique velit. Pellentesque facilisis, lorem ut fermentum egestas, arcu libero pellentesque leo, vitae dignissim enim elit sed lacus."
+ },
+ {
+ "peer": "bob",
+ "content": "Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean suscipit orci non convallis vestibulum. Integer placerat molestie lacus, sed hendrerit magna."
+ },
+ {
+ "peer": "bob",
+ "content": "Maecenas sit amet finibus augue. Quisque porta ligula non felis efficitur euismod. Integer tempor ornare tempus."
+ },
+ {
+ "peer": "alice",
+ "content": "I like that Lorem Ipsum too. I'm going to go to the store to buy some groceries now."
+ },
+ {
+ "peer": "bob",
+ "content": "That's cool, I'll join you."
+ },
+ {
+ "peer": "alice",
+ "content": "Let's take my station wagon. It carries lots of stuff."
+ },
+ {
+ "peer": "bob",
+ "content": "Great. I want to buy a whole ocean's worth of seafood."
+ },
+ {
+ "peer": "alice",
+ "content": "We'll tell 'em to bring out the whole ocean!"
+ },
+ {
+ "peer": "bob",
+ "content": "I should probably bring a trunkful of ice. To put the seafood on. So it doesn't get hot while we're driving."
+ },
+ {
+ "peer": "alice",
+ "content": "Smart thinking. It's going to be hot out there. Weather lady says it's going to be 100 degrees."
+ },
+ {
+ "peer": "bob",
+ "content": "Farenheit or Celsius?"
+ },
+ {
+ "peer": "alice",
+ "content": "Celsius."
+ },
+ {
+ "peer": "bob",
+ "content": "...I don't believe you. That's too hot."
+ },
+ {
+ "peer": "alice",
+ "content": "I'm not sure what you mean. We live on Mercury. It gets pretty hot."
+ },
+ {
+ "peer": "bob",
+ "content": "Oh yeah.. I forgot. We *do* live on Mercury. I'm still getting used to the heat."
+ },
+ {
+ "peer": "alice",
+ "content": "Ha ha, it takes a while. Anyways, get your suit on and let's go."
+ },
+ {
+ "peer": "bob",
+ "content": "Fish, shipped straight from Earth's ocean! Yippee!"
+ },
+ {
+ "peer": "alice",
+ "content": "Alright, I'll start the air conditioning in the wagon while you grab your thermal suit."
+ },
+ {
+ "peer": "bob",
+ "content": "Good idea. The UV protection on this suit is supposed to be top-notch. Still feels weird wearing it every time we go out."
+ },
+ {
+ "peer": "alice",
+ "content": "You'll get used to it. Remember when I first moved here from Earth? I couldn't even walk to the mailbox without overheating."
+ },
+ {
+ "peer": "bob",
+ "content": "At least the grocery store has that cool underground section. Keeps the produce fresh and us comfortable."
+ },
+ {
+ "peer": "alice",
+ "content": "True! And they just got a new shipment of Earth vegetables yesterday. Want to grab some tomatoes for a salad?"
+ },
+ {
+ "peer": "bob",
+ "content": "Definitely. Do you think they'll have any of those Earth strawberries? They're so much sweeter than the hydroponic ones."
+ },
+ {
+ "peer": "alice",
+ "content": "Maybe, but they're probably expensive. The shipping costs from Earth are astronomical these days."
+ },
+ {
+ "peer": "bob",
+ "content": "Worth every credit though. Hey, should we grab some ice cream too? The mercury heat makes me crave something cold."
+ },
+ {
+ "peer": "alice",
+ "content": "Smart thinking! They have that new Martian vanilla flavor that everyone's been talking about."
+ },
+ {
+ "peer": "bob",
+ "content": "Perfect. Okay, I'm suited up and ready. Let's go before the afternoon heat wave hits!"
+ }
+ ]
+ }
+ },
+ "queries": [],
+ "get_context_calls": [
+ {
+ "session": "session1",
+ "summary": true
+ }
+ ]
+}
diff --git a/tests/bench/tests/summary_and_query.json b/tests/bench/tests/summary_and_query.json
index 32300f4b..c78af985 100644
--- a/tests/bench/tests/summary_and_query.json
+++ b/tests/bench/tests/summary_and_query.json
@@ -183,11 +183,6 @@
"summary": true,
"max_tokens": 50
},
- {
- "session": "session1",
- "summary": true,
- "max_tokens": 100
- },
{
"session": "session1",
"summary": true,
@@ -198,11 +193,6 @@
"summary": true,
"max_tokens": 500
},
- {
- "session": "session1",
- "summary": true,
- "max_tokens": 800
- },
{
"session": "session1",
"summary": true,
@@ -217,6 +207,10 @@
"session": "session1",
"summary": true,
"max_tokens": 2500
+ },
+ {
+ "session": "session1",
+ "summary": true
}
]
}
diff --git a/tests/bench/tests/summary_long_messages.json b/tests/bench/tests/summary_long_messages.json
new file mode 100644
index 00000000..6e61e10b
--- /dev/null
+++ b/tests/bench/tests/summary_long_messages.json
@@ -0,0 +1,259 @@
+{
+ "sessions": {
+ "session1": {
+ "messages": [
+ {
+ "peer": "alice",
+ "content": "Good morning, my dear colleagues and friends! As I sit here in my sunlit kitchen, sipping what I must say is an exceptionally well-crafted Ethiopian single-origin coffee - the beans sourced from a small cooperative farm in the Sidamo region that I discovered during my travels last year - I find myself contemplating the philosophical implications of beginning yet another Monday. There's something profoundly existential about these weekly cycles, isn't there? As Camus wrote in 'The Myth of Sisyphus': 'The struggle itself toward the heights is enough to fill a man's heart. One must imagine Sisyphus happy.' Perhaps we are all Sisyphus, pushing our metaphorical boulders up the corporate mountain, only to watch them roll down each Friday evening, yet finding meaning and even joy in the eternal repetition."
+ },
+ {
+ "peer": "bob",
+ "content": "Alice, your literary musings never cease to amaze me, though I must confess that this morning finds me in a considerably less philosophical state. I'm operating on approximately three hours of sleep, having spent the better part of last night debugging a particularly stubborn piece of legacy code that seems to have been written by someone who clearly never heard of documentation or, for that matter, basic programming principles. The coffee situation here is dire - I'm down to instant coffee from a jar that's been sitting in my cupboard since approximately the Mesozoic era. As T.S. Eliot so eloquently captured in 'The Love Song of J. Alfred Prufrock': 'I have measured out my life with coffee spoons.' This morning, those coffee spoons feel particularly insufficient for the task at hand."
+ },
+ {
+ "peer": "charlie",
+ "content": "Bob, I completely empathize with your coding struggles - there's nothing quite like inheriting a codebase that appears to have been crafted by someone who viewed variable naming conventions as mere suggestions and comments as optional decorations. However, I must say I'm genuinely excited about the project I'm embarking upon today. I've been commissioned to design a complete website overhaul for this charming little bakery called 'Flour & Dreams' that's been a neighborhood institution for over forty years. The owner, Mrs. Petrosky, is this wonderful elderly woman who immigrated from Poland in the 1960s and has been perfecting her grandmother's recipes ever since. She showed me these faded, handwritten recipe cards covered in flour stains and notes in Polish, and I realized I'm not just designing a website - I'm helping to preserve a cultural legacy. As Maya Angelou wrote: 'There is no greater agony than bearing an untold story inside you.' This bakery's story deserves to be told beautifully."
+ },
+ {
+ "peer": "dan",
+ "content": "Charlie, that sounds absolutely magnificent! There's something deeply moving about projects that connect us to human stories and cultural heritage. It reminds me of what I'm grappling with in my own work lately - I've been thinking extensively about how we can make our client interactions more meaningful and authentic. Today's schedule is particularly intense: I have five client meetings lined up, each requiring a completely different mindset and approach. The first is with a tech startup whose founder seems to believe that disruption is synonymous with ignoring established business principles. The second is with a century-old family business that's struggling to adapt to digital transformation while preserving their traditional values. It's like trying to bridge completely different worlds, each with their own language and logic. Dickens captured this beautifully in 'A Tale of Two Cities': 'It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness.' That quote feels particularly relevant to our current business landscape."
+ },
+ {
+ "peer": "erin",
+ "content": "Dan, your observation about bridging different worlds resonates deeply with me, especially as I'm working on this marketing campaign for an AI startup that's developing chatbots for customer service applications. The challenge isn't just communicating the technical capabilities - it's helping people understand how artificial intelligence can enhance rather than replace human connection. I've been researching the psychology of human-computer interaction, diving deep into papers about the uncanny valley effect and how people respond to increasingly sophisticated AI. The deadline pressure is intense - we're launching Thursday - but I find myself thinking about how Virginia Woolf described the creative process in 'A Room of One's Own': 'For masterpieces are not single and solitary births; they are the outcome of many years of thinking in common, of thinking by the body of the people, so that the experience of the mass is behind the single voice.' This campaign needs to capture that collective human experience and show how AI can amplify it rather than diminish it."
+ },
+ {
+ "peer": "frank",
+ "content": "Good morning, everyone! Your Monday morning energy is both inspiring and slightly overwhelming for someone who just spent forty-five minutes crawling through traffic that can only be described as Kafkaesque in its absurd futility. The construction on Main Street has transformed what should be a simple fifteen-minute commute into an existential meditation on the nature of modern urban planning. I watched a city worker standing motionless next to a hole in the ground for what must have been twenty minutes, occasionally adjusting his hard hat but otherwise appearing to be engaged in some form of interpretive performance art. Speaking of performance art, I have that crucial presentation this afternoon about our Q3 sales numbers, and I'm oscillating between cautious optimism and mild panic. As Shakespeare wrote in 'Hamlet': 'There is nothing either good or bad, but thinking makes it so.' I'm trying to think positively about those numbers, but the spreadsheets seem to have their own opinion on the matter."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, your description of the morning commute as Kafkaesque is both amusing and disturbingly accurate. I encountered the same construction project and found myself contemplating the strange ritual of modern transportation - dozens of isolated individuals, each encased in their metal containers, collectively creating a massive, slow-moving organism that serves no one's interests particularly well. It's like a physical manifestation of what sociologists call 'atomization' - we're all together yet fundamentally alone. Your mention of Shakespeare reminds me of another passage from 'Hamlet' that seems relevant to our Monday morning condition: 'What a piece of work is man! How noble in reason, how infinite in faculty! In form and moving how express and admirable!' Yet here we are, these supposedly admirable beings, trapped in traffic patterns that would confuse a medieval peasant. The irony is almost too perfect. I do hope your Q3 presentation goes splendidly - positive thinking combined with solid data analysis tends to work wonders."
+ },
+ {
+ "peer": "bob",
+ "content": "You know, this conversation about traffic and commuting has made me reflect on why I've become so committed to cycling to work, despite the occasional hazards of sharing the road with drivers who seem to view bicyclists as either invisible obstacles or deliberate provocations. There's something profoundly liberating about human-powered transportation - it connects you to the environment in a way that sitting in a climate-controlled metal box never could. You feel the wind, smell the morning air (for better or worse, depending on your route), and engage with the city as a living, breathing entity rather than just a series of obstacles between point A and point B. Plus, there's the added benefit of arriving at work with endorphins already flowing, which certainly helps when facing the kind of debugging marathon that awaits me today. As Thoreau wrote in 'Walden': 'I went to the woods to live deliberately, to front only the essential facts of life.' I may not be going to the woods, but there's something deliberately essential about choosing the bicycle over the automobile."
+ },
+ {
+ "peer": "dan",
+ "content": "Bob, your philosophical approach to cycling is admirable, and it makes me somewhat envious of your ability to integrate physical activity into your daily routine. My schedule today is so packed with meetings that I suspect I'll be lucky to find time for a proper lunch, let alone any form of exercise. The complexity of modern professional life sometimes feels like we're all characters in a Beckett play - going through elaborate rituals and procedures that may or may not have any ultimate meaning, but which nonetheless consume the majority of our waking hours. I have three in-person meetings scheduled - one with a potential client who wants to 'disrupt the disruption industry' (whatever that means), another with a established manufacturing company that's terrified of digital transformation, and a third with a nonprofit that wants to maximize social impact while operating on a budget that wouldn't cover my coffee expenses for a month. Then there are two virtual meetings, including one with a client in Tokyo, which means I'll be discussing quarterly projections at what will feel like an ungodly hour given my circadian rhythms. It's like living in multiple time zones simultaneously."
+ },
+ {
+ "peer": "erin",
+ "content": "Dan, your description of meetings spanning multiple time zones really captures something fundamental about contemporary work life - we're living in this strange temporal displacement where our bodies exist in one reality while our minds are constantly being pulled into other zones, other contexts, other people's schedules and priorities. It's particularly challenging when you're trying to maintain creative energy for projects like this AI marketing campaign I'm developing. I've been reading extensively about the history of human-computer interaction, from Ada Lovelace's prescient writings about the Analytical Engine to Alan Turing's famous test for machine intelligence. There's this beautiful quote from Lovelace where she wrote: 'The Analytical Engine might act upon other things besides number, were objects whose mutual fundamental relations could be expressed by those of the abstract science of operations.' She was envisioning, more than a century before the internet, the possibility that machines could work with any kind of information that could be systematically organized. My challenge is communicating that same sense of wonder and possibility to people who are understandably nervous about AI replacing human workers."
+ },
+ {
+ "peer": "charlie",
+ "content": "Erin, your historical perspective on AI development is fascinating and reminds me why I love working on projects that have deep cultural and historical roots, like this bakery website I'm designing. Mrs. Petrosky shared some incredible stories about her family's baking traditions - techniques that have been passed down through generations, surviving wars, immigration, economic upheavals, and cultural changes. She told me about how her grandmother used to bake bread in a wood-fired oven that her grandfather built with stones carried from their village in Poland. During World War II, when ingredients were scarce, her grandmother developed variations of traditional recipes using whatever was available - potato flour instead of wheat, honey instead of sugar, herbs from the garden instead of expensive spices. These weren't just adaptations; they were acts of cultural preservation and resistance. As James Baldwin wrote: 'Not everything that is faced can be changed, but nothing can be changed until it is faced.' This bakery represents generations of people facing challenges and adapting while preserving what matters most. My job is to translate that resilience and continuity into digital form."
+ },
+ {
+ "peer": "frank",
+ "content": "Charlie, the stories about Mrs. Petrosky's family really highlight something important about the nature of tradition and adaptation that I think relates to what I'm trying to accomplish with this afternoon's sales presentation. I've been analyzing our Q3 numbers from multiple angles, and what's emerging is a story about how our company has navigated some significant market shifts over the past quarter. We faced supply chain disruptions, changes in consumer behavior, new competitive pressures, and regulatory changes - any one of which could have been seriously destabilizing. But our team found ways to adapt, just like Mrs. Petrosky's grandmother adapting her recipes during wartime. The numbers tell a story of resilience and creative problem-solving that I want to make sure comes through in my presentation. As Winston Churchill said: 'Success is not final, failure is not fatal: it is the courage to continue that counts.' Our Q3 results aren't just statistics; they're evidence of our collective courage to continue innovating and adapting in the face of uncertainty. The challenge is presenting that narrative in a way that's both compelling and credible to stakeholders who might only be looking at the bottom line."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, your approach to storytelling through data analysis reminds me of something I've been thinking about regarding the nature of work and meaning in our contemporary economy. We're all, in our different ways, engaged in the project of creating narratives - whether through code, marketing campaigns, business presentations, or website designs. It's as if we're all participating in this massive, collaborative novel where each of our professional contributions adds a chapter to a larger story about human adaptation and creativity. I was reading Jorge Luis Borges last night - specifically his story 'The Library of Babel' - where he imagines a universe in the form of a vast library containing every possible book that could ever be written. Most of the books are nonsense, but hidden among them are all the meaningful stories, scientific discoveries, and philosophical insights that humanity could ever produce. Sometimes I feel like our daily work is similar - we're all searching through the infinite possibilities of our respective fields, looking for those meaningful combinations of elements that will resonate with other people and create value in the world. Your Q3 presentation, Charlie's bakery website, Erin's AI campaign - they're all attempts to find meaning in the vast library of possibilities."
+ },
+ {
+ "peer": "bob",
+ "content": "Alice, your Borges reference is particularly apt given the debugging challenge I'm facing today. This legacy codebase I'm working with feels exactly like one of those nonsensical books from the Library of Babel - it appears to contain meaningful information, but the logic is so convoluted and poorly documented that extracting useful understanding requires archaeological-level investigation. I've been tracing through functions that call other functions that reference variables defined in completely different modules, following a chain of dependencies that would make Rube Goldberg proud. The original programmer seems to have had a unique relationship with conventional programming practices - variable names like 'temp1,' 'temp2,' and 'finalfinalFINAL' suggest someone who viewed code as a private conversation with themselves rather than a form of communication with future maintainers. There's something almost poetic about the challenge, though. As William Gibson wrote in 'Neuromancer': 'Cyberspace. A consensual hallucination experienced daily by billions of legitimate operators.' This code feels like a non-consensual hallucination experienced by anyone unfortunate enough to inherit it. But there's satisfaction in gradually imposing order on chaos, in making the implicit explicit, in transforming confusion into clarity."
+ },
+ {
+ "peer": "erin",
+ "content": "Bob, your description of debugging as an archaeological investigation really resonates with the research I've been doing for this AI campaign. I've been diving deep into the history of artificial intelligence development, and it's fascinating how many false starts, abandoned approaches, and brilliant insights have been buried in academic papers and technical documentation over the decades. The field is littered with ideas that were ahead of their time, algorithms that seemed promising but hit computational limitations, and philosophical debates about the nature of intelligence that still haven't been resolved. For example, I spent hours yesterday reading about the Dartmouth Conference of 1956, where the term 'artificial intelligence' was first coined. The participants had this incredible optimism about what they could accomplish - they thought they could create human-level AI within a few decades. Obviously, that timeline was overly optimistic, but their fundamental insights about pattern recognition, symbolic reasoning, and machine learning laid the groundwork for everything we're seeing today. As Arthur C. Clarke wrote: 'Any sufficiently advanced technology is indistinguishable from magic.' The challenge of my campaign is helping people understand that AI isn't magic - it's the result of decades of incremental scientific progress, built on mathematical principles and statistical methods that are ultimately comprehensible."
+ },
+ {
+ "peer": "dan",
+ "content": "Erin, your historical perspective on AI development connects beautifully with what I've been observing in my client work lately. There's this fascinating tension between companies that want to embrace cutting-edge technology and their simultaneous fear of being disrupted by changes they don't fully understand. The client I'm meeting with this afternoon who wants to 'disrupt the disruption industry' embodies this perfectly - they're using buzzwords about innovation while fundamentally misunderstanding what innovation actually requires. True innovation, as I've learned from studying business history, rarely comes from trying to be disruptive for its own sake. It emerges from deep understanding of real problems and creative approaches to solving them. As Peter Drucker wrote: 'Innovation is the specific instrument of entrepreneurship. The act that endows resources with a new capacity to create wealth.' But so many companies today seem to think that innovation is just about adopting the latest technology without considering whether it actually addresses their customers' needs or improves their value proposition. My job is often to help clients distinguish between genuine innovation opportunities and technological solutions in search of problems. It requires a delicate balance of encouraging forward-thinking while maintaining grounding in business fundamentals."
+ },
+ {
+ "peer": "charlie",
+ "content": "Dan, your observations about innovation versus disruption for its own sake remind me of the conversation I had with Mrs. Petrosky about how her bakery has evolved over the decades. She's not interested in disrupting the baking industry - she's focused on continuously improving her craft while honoring the traditions that give her work meaning. But she's also been remarkably adaptive when it comes to incorporating new techniques and technologies that genuinely enhance her products. For example, she invested in a humidity-controlled proofing chamber that allows her to achieve more consistent results with her sourdough, and she's started using locally-sourced grains from farms that practice regenerative agriculture. These aren't flashy innovations, but they represent thoughtful evolution based on deep understanding of her craft and her customers' values. As William Morris wrote: 'The true secret of happiness lies in taking a genuine interest in all the details of daily life.' Mrs. Petrosky embodies this principle - she finds genuine joy in perfecting the texture of her rye bread or experimenting with new flavor combinations for her seasonal cookies. My challenge as her web designer is to capture that same attention to detail and authentic passion in digital form. The website needs to feel as warm and inviting as walking into her bakery on a cold morning."
+ },
+ {
+ "peer": "frank",
+ "content": "Charlie, your description of Mrs. Petrosky's approach to balancing tradition with thoughtful innovation perfectly captures what I hope to communicate in this afternoon's presentation about our Q3 performance. The most successful aspects of our quarter weren't the result of chasing trends or implementing technology for its own sake - they came from identifying specific problems our customers were facing and developing targeted solutions that built on our existing strengths. We didn't try to reinvent our entire business model; we enhanced it in ways that created genuine value. For example, our supply chain team developed a new inventory management system that reduced waste while improving delivery times, but they did it by deepening their understanding of demand patterns rather than just buying expensive predictive analytics software. Our customer service team improved satisfaction ratings by implementing better training protocols and empowering representatives to make decisions, not by replacing human agents with chatbots. As Ralph Waldo Emerson wrote: 'Do not go where the path may lead, go instead where there is no path and leave a trail.' But sometimes the most valuable trail you can leave is one that shows how to do familiar things exceptionally well rather than constantly seeking novelty. The challenge is presenting this philosophy to stakeholders who may be expecting more dramatic innovations."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, your point about doing familiar things exceptionally well rather than constantly seeking novelty touches on something fundamental about the nature of expertise and mastery. I've been thinking about this a lot lately as I observe the different approaches people take to their work. There's tremendous pressure in our culture to constantly innovate and disrupt, but some of the most satisfying and valuable work comes from the patient development of deep skills and understanding. I was reading about traditional Japanese craftsmanship yesterday - the concept of 'shokunin,' which refers to artisans who dedicate their lives to perfecting their craft. A shokunin doesn't just make sushi or forge knives or arrange flowers; they pursue absolute mastery through decades of careful attention to every detail of their practice. As Jiro Ono, the famous sushi master, said: 'Once you decide on your occupation, you must immerse yourself in your work. You have to fall in love with your work. Never complain about your job. You must dedicate your life to mastering your skill.' This philosophy seems increasingly countercultural in an economy that celebrates rapid iteration and 'fail fast' mentalities, but there's something profound about the alternative approach - the commitment to excellence through sustained focus and continuous refinement."
+ },
+ {
+ "peer": "bob",
+ "content": "Alice, your reflection on shokunin philosophy resonates deeply with my experience as a programmer. The debugging work I'm doing today requires exactly that kind of patient, meticulous attention to detail that you're describing. Each line of code needs to be understood not just in isolation, but in relationship to the entire system - how it connects to other modules, what assumptions it makes about data structures, how it handles edge cases and error conditions. There's no shortcut to this kind of understanding; it requires the slow accumulation of knowledge through careful observation and systematic analysis. The original programmer who created this mess clearly lacked that kind of patience and attention to detail, but trying to clean it up is teaching me things about code architecture that I never would have learned from building something from scratch. As Robert Pirsig wrote in 'Zen and the Art of Motorcycle Maintenance': 'The real cycle you're working on is a cycle called yourself. The machine that appears to be 'out there' and the person that appears to be 'in here' are not two separate things. They grow toward Quality or fall away from Quality together.' The code I'm debugging isn't just a technical artifact; it's a reflection of someone's thinking process, their understanding of the problem domain, their relationship to their craft. Improving the code requires understanding not just what it does, but how and why it came to be the way it is."
+ },
+ {
+ "peer": "erin",
+ "content": "Bob, your connection between code quality and the programmer's relationship to their craft beautifully illustrates something I've been grappling with in this AI marketing campaign. There's often a disconnect between how technology is developed - through the kind of careful, methodical process you're describing - and how it's marketed to the public. The general public sees AI as this almost magical technology that can solve any problem, but the reality is much more nuanced and, in many ways, more interesting. The developers I've been interviewing for this campaign all talk about AI in terms very similar to what you're describing - as a craft that requires deep understanding of mathematical principles, careful attention to data quality, and patient iteration through countless experiments and refinements. They speak about training models the way a master chef might talk about developing a sauce - it's not just following a recipe, but understanding how different ingredients interact, how timing and temperature affect the outcome, how to adjust the process based on subtle variations in raw materials. As Richard Feynman said: 'I would rather have questions that can't be answered than answers that can't be questioned.' The best AI researchers I've met embody this principle - they're constantly questioning their assumptions, testing edge cases, and remaining humble about the limitations of their current understanding. My challenge is translating that nuanced, craft-based reality into marketing messages that resonate with business leaders who want simple answers to complex problems."
+ },
+ {
+ "peer": "dan",
+ "content": "Erin, your observation about the disconnect between technological reality and marketing simplification is something I encounter constantly in client work. Business leaders often want technology to be a silver bullet that can solve complex organizational problems without requiring fundamental changes to how they operate. But as I've learned from years of consulting, sustainable innovation requires understanding the deep structural issues that technology alone cannot address. The manufacturing client I'm meeting with this afternoon is a perfect example - they want to implement digital transformation initiatives, but they're resistant to examining whether their current business processes actually make sense in a digital context. They've been doing things the same way for decades, and while some of those practices embody valuable institutional knowledge, others are just legacy habits that served purposes that no longer exist. As John Maynard Keynes wrote: 'The difficulty lies not so much in developing new ideas as in escaping from old ones.' Helping organizations escape from old ideas while preserving valuable institutional wisdom requires the same kind of careful, patient analysis that Bob is applying to his debugging work. You have to understand not just what the current system does, but why it evolved to work that way, what problems it was originally designed to solve, and which of those problems are still relevant. Only then can you thoughtfully redesign processes to take advantage of new technological capabilities."
+ },
+ {
+ "peer": "charlie",
+ "content": "Dan, your point about preserving valuable institutional wisdom while embracing beneficial change perfectly describes what I'm trying to achieve with Mrs. Petrosky's bakery website. She has decades of knowledge about her customers' preferences, seasonal buying patterns, which products work well together, how to time production to ensure freshness - all of this accumulated through daily interaction with her community. A poorly designed website might ignore this knowledge and just focus on e-commerce functionality, but I want to create something that amplifies and extends her existing expertise rather than replacing it. For example, instead of just having a generic online ordering system, I'm designing features that reflect her deep understanding of how people actually use her bakery. There's a section for regular customers who want to set up weekly orders for their usual favorites, another for people planning special events who need guidance on quantities and combinations, and a seasonal recommendations feature that shares her knowledge about which items are at their peak during different times of year. As Christopher Alexander wrote in 'A Pattern Language': 'The ultimate goal of the designer is to create a living whole.' Mrs. Petrosky's bakery is already a living whole - a vital part of her neighborhood's social fabric. My job is to extend that wholeness into digital space without diminishing what makes it special in physical space."
+ },
+ {
+ "peer": "frank",
+ "content": "Charlie, your approach to web design as an extension of existing community relationships rather than a replacement for them captures something essential about how I want to frame our Q3 results this afternoon. The numbers tell a story about how our company has strengthened its relationships with customers, suppliers, and employees during a challenging quarter. We didn't just focus on short-term metrics; we invested in the kind of long-term partnerships that create sustainable value for everyone involved. For example, when supply chain disruptions threatened to delay deliveries to key customers, our operations team worked closely with suppliers to develop alternative sourcing strategies that actually improved quality while reducing costs. Instead of just switching to cheaper suppliers, they took the time to understand each supplier's capabilities and constraints, then collaborated on process improvements that benefited everyone. Our customer retention rates improved not because we offered discounts, but because we demonstrated genuine commitment to solving our customers' problems. As Warren Buffett said: 'It takes 20 years to build a reputation and five minutes to ruin it. If you think about that, you'll do things differently.' Our Q3 performance reflects the kind of thinking that builds long-term reputation rather than optimizing for quarterly results. The challenge is helping stakeholders understand that this approach, while sometimes requiring patience, ultimately generates more sustainable returns than chasing short-term gains."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, your emphasis on long-term thinking and sustainable relationships really resonates with me, particularly as I reflect on how we're all navigating the balance between immediate pressures and deeper values in our work. I've been reading a lot lately about the concept of 'temporal citizenship' - the idea that we have responsibilities not just to our current community, but to future generations who will inherit the consequences of our decisions. This morning's coffee ritual, which might seem like a simple pleasure, actually represents a complex web of relationships that extend across continents and decades. The Ethiopian farmers who grew these beans are part of a cooperative that's working to maintain traditional growing methods while adapting to climate change. The roaster I buy from has committed to paying premium prices that allow farming families to invest in sustainable practices and education for their children. Even my choice to take time for mindful consumption rather than grabbing coffee on the run represents a small act of resistance against the acceleration culture that dominates so much of contemporary life. As Adrienne Rich wrote: 'There must be those among whom we can sit down and weep and still be counted as warriors.' Sometimes the most radical thing we can do is simply slow down enough to understand the full implications of our choices and align our daily practices with our deeper values."
+ },
+ {
+ "peer": "bob",
+ "content": "Alice, your concept of temporal citizenship and the interconnectedness of daily choices really challenges me to think differently about this debugging work I'm doing. On the surface, it might seem like a purely technical task - fixing broken code so that software functions properly. But when I think about it in the broader context you're describing, I realize that the code I write and maintain today will be inherited by future programmers who will have to live with the consequences of my decisions. The messy legacy codebase I'm cleaning up is the result of someone who didn't consider their temporal citizenship responsibilities - they prioritized short-term functionality over long-term maintainability, leaving technical debt that costs time and energy for everyone who comes after. As I refactor this code, I'm trying to write comments that explain not just what the code does, but why certain approaches were chosen, what alternatives were considered, and what trade-offs were made. I'm choosing variable names that will still make sense to someone reading the code five years from now. I'm structuring modules in ways that will make future modifications easier rather than just getting the current requirements working as quickly as possible. It's like what Stewart Brand wrote about in 'How Buildings Learn': 'All buildings are predictions. All predictions are wrong.' The same is true for software - we can't anticipate every future requirement, but we can create structures that are adaptable and comprehensible to the people who will need to modify them."
+ },
+ {
+ "peer": "erin",
+ "content": "Bob, your approach to coding as a form of temporal citizenship beautifully illustrates something I've been struggling with in this AI marketing campaign. The technology we're promoting today will shape how people think about artificial intelligence for years to come, and I feel a real responsibility to represent it accurately rather than contributing to unrealistic expectations or unfounded fears. The AI field is at this crucial inflection point where public understanding is being formed largely through marketing messages and media coverage rather than direct experience with the technology. If we oversell AI capabilities, we contribute to the hype cycle that leads to disillusionment when reality doesn't match expectations. If we undersell it, we might prevent beneficial applications from being adopted. I've been reading extensively about the history of technology adoption - from the printing press to the internet - and there's always this tension between visionary claims and practical limitations. As Ursula K. Le Guin wrote: 'We live in capitalism. Its power seems inescapable. So did the divine right of kings.' The narratives we tell about technology aren't just descriptions; they're part of shaping the future we're creating. My responsibility is to craft messages that help people make informed decisions about how they want AI to fit into their lives and work, rather than just accepting whatever version gets marketed most aggressively. This means being honest about current limitations while also helping people understand the genuine potential for positive impact."
+ },
+ {
+ "peer": "dan",
+ "content": "Erin, your reflection on the responsibility that comes with shaping public understanding of technology connects directly to what I'm experiencing in today's client meetings. Each conversation is an opportunity to influence how business leaders think about change, innovation, and the relationship between technology and human value. The startup founder who wants to 'disrupt the disruption industry' represents one extreme - the belief that innovation is always good, that faster is always better, that existing systems are inherently flawed and should be replaced rather than improved. But the family business struggling with digital transformation represents the opposite extreme - the belief that traditional ways of doing things are always superior, that change is inherently threatening, that new technologies will necessarily diminish human connection and craftsmanship. Neither perspective fully captures the complexity of our current moment. As Friedrich Nietzsche wrote: 'You must have chaos within you to give birth to a dancing star.' Innovation requires embracing uncertainty and change, but not chaos for its own sake. It requires the wisdom to distinguish between changes that serve human flourishing and changes that simply create disruption. My role is often to help clients find the middle path - identifying opportunities where new technologies can amplify existing strengths rather than replacing them, where efficiency gains can free up time and energy for more meaningful work rather than just cutting costs. It's delicate work that requires understanding not just business metrics, but the deeper human needs that organizations are trying to serve."
+ },
+ {
+ "peer": "charlie",
+ "content": "Dan, your description of finding the middle path between uncritical embrace of change and rigid resistance to innovation perfectly captures the challenge I'm facing with Mrs. Petrosky's website project. She's simultaneously excited about reaching new customers online and worried about losing the personal connections that make her bakery special. Yesterday, she told me about a regular customer, Mr. Chen, who stops by every Tuesday morning for a coffee and a blueberry scone. Over the years, she's learned that he likes his coffee extra hot, prefers the scones from the second batch because they're a little less sweet, and always asks about her granddaughter's piano lessons. That kind of relationship can't be replicated online, but it can be honored and extended in thoughtful ways. I'm designing features that help her maintain those personal connections even when customers order digitally - notes that remind her of preferences, a system for her to send personal messages with orders, ways for regular customers to share updates about their lives. As Jane Jacobs wrote in 'The Death and Life of Great American Cities': 'Cities have the capability of providing something for everybody, only because, and only when, they are created by everybody.' Mrs. Petrosky's bakery provides something special for her neighborhood because it's been shaped by thousands of daily interactions with customers who have become part of her extended community. The website needs to support and enhance that community-building function rather than replacing it with impersonal transactions."
+ },
+ {
+ "peer": "frank",
+ "content": "Charlie, your story about Mr. Chen and his Tuesday morning routine really drives home something important about the nature of business success that I want to emphasize in this afternoon's presentation. Our Q3 numbers reflect thousands of relationships like that - not just transactions, but ongoing connections built on mutual understanding and consistent value delivery. When I analyze our customer retention data, I see evidence of the same kind of personal attention that Mrs. Petrosky provides. Our account managers don't just process orders; they understand each client's business cycles, anticipate their needs, and proactively offer solutions that help them succeed. Our support team doesn't just solve technical problems; they build relationships with customers that make future interactions more efficient and more pleasant. These relationship investments don't always show up clearly in quarterly metrics, but they create the foundation for sustainable growth and competitive advantage. As Maya Angelou said: 'People will forget what you said, people will forget what you did, but people will never forget how you made them feel.' Our Q3 success isn't just about the products we sold or the services we delivered; it's about how we made our customers, suppliers, and employees feel valued and understood. The challenge is quantifying and communicating this relationship-based value creation to stakeholders who might be primarily focused on traditional financial metrics. I need to tell a story that shows how investing in relationships generates measurable business results, not just warm feelings."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, your insight about the relationship between feeling valued and measurable business results touches on something fundamental about human motivation and engagement that extends far beyond commercial transactions. I've been thinking lately about how the quality of our daily interactions - whether with colleagues, customers, service providers, or even strangers we encounter briefly - creates ripple effects that shape the broader culture we all inhabit. This morning's commute through the construction zone, for example, could have been just an exercise in frustration, but I noticed small moments of courtesy and cooperation that transformed the experience. A driver who let someone merge without honking, a construction worker who made eye contact and smiled when our cars passed, pedestrians who helped each other navigate around barriers - these tiny interactions created a sense of shared humanity that lifted my mood and probably influenced how I'll interact with others throughout the day. As Margaret Mead famously said: 'Never doubt that a small group of thoughtful, committed citizens can change the world; indeed, it's the only thing that ever has.' But I think we can extend that principle to individual interactions as well - never doubt that a single moment of genuine attention and care can change someone's day, which changes how they treat others, which contributes to changing the world. The coffee ritual I described earlier isn't just about caffeine or even personal pleasure; it's about taking time to appreciate the network of relationships that makes that moment possible, and carrying that appreciation into other interactions throughout the day."
+ },
+ {
+ "peer": "bob",
+ "content": "Alice, your observation about small interactions creating ripple effects really reframes how I'm thinking about the collaborative aspects of programming. Even though much of my debugging work today feels solitary - just me, the computer, and this labyrinthine codebase - it's actually part of an extended conversation with past and future programmers who will work on this system. Every decision I make about how to structure the refactored code is a message to future maintainers about how I think the system should be understood and modified. Every comment I write is an attempt to share not just technical information, but the reasoning process that led to particular solutions. When I choose to break a large function into smaller, more focused functions, I'm suggesting a way of thinking about the problem that might help someone else understand it more quickly. When I rename variables to be more descriptive, I'm showing respect for the cognitive load that future programmers will face when they encounter this code. It reminds me of what Andy Hunt and Dave Thomas wrote in 'The Pragmatic Programmer': 'Care about your craft. Why spend your life developing software unless you care about doing it well?' But caring about craft isn't just about personal satisfaction; it's about recognizing that our work exists in relationship to other people's work, that today's code becomes tomorrow's foundation, that the quality of our attention to detail affects not just the immediate functionality but the long-term evolution of the system. In a strange way, debugging this messy legacy code has become an exercise in empathy - trying to understand what the original programmer was thinking, what constraints they were working under, what problems they were trying to solve with the tools and knowledge they had available."
+ },
+ {
+ "peer": "erin",
+ "content": "Bob, your description of programming as an empathetic dialogue across time really resonates with the research I've been doing about the social dimensions of artificial intelligence development. One of the most striking things I've learned is how much AI progress depends on collaboration between researchers who may never meet face-to-face but who build on each other's work through shared datasets, open-source algorithms, and published papers. The breakthrough innovations that make headlines are almost always the result of countless incremental contributions from researchers around the world who are essentially having an extended conversation through code and academic publications. For example, the transformer architecture that underlies modern language models was developed by a team at Google, but it built on decades of research in neural networks, attention mechanisms, and natural language processing that involved thousands of researchers across different institutions and countries. As Isaac Newton wrote: 'If I have seen further it is by standing on the shoulders of giants.' But in the context of AI development, it's more like standing on the shoulders of a vast community of scientists and engineers who have each contributed pieces to our collective understanding. My marketing challenge is helping people understand that AI isn't the product of isolated genius or corporate competition, but of human collaboration on a scale that would have been impossible before the internet enabled global knowledge sharing. The technology feels mysterious partly because the collaborative process that creates it is largely invisible to non-specialists."
+ },
+ {
+ "peer": "dan",
+ "content": "Erin, your point about the invisible collaborative process behind AI development perfectly captures something I encounter constantly in business consulting - the tendency for people to attribute success or failure to individual leaders or single decisions, when the reality is almost always much more complex and collaborative. The clients I'm meeting with today each represent organizations where hundreds or thousands of people make daily decisions that collectively determine the company's trajectory. The startup founder who wants to disrupt industries has probably never worked in a large organization and doesn't fully appreciate how much coordination and institutional knowledge is required to deliver products and services at scale. The family business struggling with digital transformation has decades of accumulated wisdom about their market and customers, but they may not recognize how much of that knowledge exists in informal relationships and undocumented processes that could be lost if they're not thoughtful about how they implement changes. As Peter Senge wrote in 'The Fifth Discipline': 'Learning organizations are possible because, deep down, we are all learners.' But organizational learning requires creating systems that capture and share individual insights, that help people understand how their work connects to broader goals, that reward collaboration and knowledge sharing rather than just individual achievement. My role is often to help organizations recognize and strengthen the collaborative processes that already exist while identifying gaps where better communication and coordination could improve outcomes. It's detective work combined with systems thinking - understanding not just what people do, but how their work interconnects with other people's work to create value."
+ },
+ {
+ "peer": "charlie",
+ "content": "Dan, your description of organizational learning and the interconnectedness of individual contributions really illuminates something I've been discovering about Mrs. Petrosky's bakery as I work on her website. What initially seemed like a small, simple business turns out to be embedded in an incredibly complex network of relationships and dependencies. She sources flour from a mill that works with local farmers who practice sustainable agriculture. Her seasonal menu depends on partnerships with nearby farms that provide fresh fruits and herbs. She coordinates with the coffee roaster down the street to ensure their products complement each other. She works with a local high school's culinary program, providing internships for students who want to learn traditional baking techniques. She participates in neighborhood events, donates leftover bread to a nearby food bank, and coordinates with other local businesses for special promotions. All of this requires constant communication, mutual support, and shared commitment to community well-being. As Wendell Berry wrote: 'A culture is not a collection of relics or ornaments, but a practical necessity.' Mrs. Petrosky's bakery isn't just preserving cultural traditions for their own sake; it's actively creating culture by fostering the kinds of relationships and practices that make communities resilient and vibrant. The website I'm designing needs to reflect and support this network of relationships rather than treating the bakery as an isolated business. I'm including features that highlight her partnerships with local suppliers, that promote community events, that help customers understand the broader ecosystem they're supporting when they buy her products. It's web design as community building rather than just e-commerce optimization."
+ },
+ {
+ "peer": "frank",
+ "content": "Charlie, your description of Mrs. Petrosky's bakery as a node in a community ecosystem beautifully illustrates the kind of systems thinking that I believe explains our strong Q3 performance. Instead of optimizing individual departments or processes in isolation, we've been focusing on understanding and strengthening the relationships between different parts of our organization and between our company and the broader networks we participate in. For example, when supply chain disruptions threatened our production schedules, our response wasn't just to find alternative suppliers as quickly as possible. Our procurement team worked with our engineering department to understand which specifications were truly critical and which could be modified to work with different suppliers. Our customer service team communicated proactively with clients about potential delays and worked with our sales team to identify opportunities to exceed expectations in other areas. Our finance team developed new metrics that measured relationship health alongside traditional cost indicators. The result wasn't just crisis management; it was organizational learning that has made us more resilient and more responsive to changing conditions. As Donella Meadows wrote in 'Thinking in Systems': 'We can't impose our will on a system. We can listen to what the system tells us, and discover how its properties and our values can work together to bring forth something much better than could ever be produced by our will alone.' Our Q3 success came from listening to the system - understanding how our internal processes interconnect and how our organization fits into the larger economic and social systems we're part of. The numbers I'll be presenting this afternoon tell a story about collaborative intelligence rather than just operational efficiency."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, your emphasis on collaborative intelligence and systems thinking brings me full circle to where we started this morning with my reflections on Sisyphus and the meaning we find in repetitive work. I'm realizing that the Monday morning ritual of reconnecting with colleagues and sharing our various projects and challenges isn't just social pleasantry - it's a form of collective sense-making that helps us understand how our individual efforts contribute to larger patterns of meaning and value creation. Each of us is working on what might seem like separate projects - debugging code, designing websites, developing marketing campaigns, presenting business results - but our conversation has revealed the common themes and shared challenges that connect our work. We're all grappling with questions about how to balance innovation with tradition, how to use technology to enhance rather than replace human connection, how to take responsibility for the long-term consequences of our daily decisions. As Rainer Maria Rilke wrote in 'Letters to a Young Poet': 'The future enters into us, in order to transform itself in us, long before it happens.' The future we're creating through our work isn't determined by any single project or decision, but by the accumulated impact of countless small choices made with attention to their broader implications. This morning's conversation has helped me see more clearly how my individual work connects to the larger project of creating a world that balances technological capability with human wisdom, efficiency with meaning, progress with sustainability. That's a vision worth pushing the boulder uphill for, again and again, with genuine joy in the effort itself."
+ },
+ {
+ "peer": "bob",
+ "content": "Wait, is anyone else experiencing massive system outages right now? I just lost connection to our entire development environment. All the servers I was working on have gone dark, and I'm getting timeout errors on everything. This isn't just my local machine - it looks like our entire cloud infrastructure might be down. I was in the middle of that critical refactoring work when everything just... disappeared. My heart is racing because I'm not sure if I've lost hours of work or if the systems will come back online with everything intact. This is exactly the kind of scenario that makes you realize how dependent we've become on interconnected digital systems. As William Gibson wrote in 'Neuromancer': 'The sky above the port was the color of television, tuned to a dead channel.' That's what my screen looks like right now - nothing but error messages and failed connection attempts. The timing couldn't be worse, but maybe this is an opportunity to test our crisis response protocols and see how well our backup systems actually work under pressure."
+ },
+ {
+ "peer": "charlie",
+ "content": "Oh no, Bob! I'm seeing the same thing here. My entire design environment just crashed, and I can't access any of the cloud-based tools I use for Mrs. Petrosky's website project. All my work from this morning seems to be trapped in systems I can't reach. But more importantly, I'm worried about Mrs. Petrosky herself - her bakery's point-of-sale system, online ordering platform, and customer database are all cloud-based. If this outage is as widespread as it seems, she might not be able to process transactions or access customer information. This could be devastating for a small business that depends on daily cash flow. I'm thinking about what we discussed earlier regarding the interconnectedness of systems and our responsibilities to the communities we serve. Right now, those abstract philosophical discussions about technology dependence are becoming very concrete and urgent. As E.M. Forster wrote in 'The Machine Stops': 'The Machine stops!' And when it does, we discover how fragile our carefully constructed digital lives really are. I need to get to the bakery immediately to help her figure out alternative ways to serve customers and protect her business during this crisis."
+ },
+ {
+ "peer": "dan",
+ "content": "This is a disaster! I have my most important client presentation in two hours, and all my presentation materials, financial models, and supporting documentation are stored in cloud systems that are completely inaccessible right now. The Q3 data that Frank and I have been discussing all morning - it's all trapped in systems that won't respond. My clients are flying in from three different cities specifically for this meeting, and I have no way to contact them because my CRM system is down and I can't access their contact information. This isn't just a technical inconvenience; it's a complete breakdown of the business infrastructure that modern professional life depends on. I'm experiencing firsthand what Nassim Taleb calls a 'black swan event' - something that seems impossible until it happens, and then it changes everything. The interdependence that we've been celebrating in our conversation this morning has suddenly revealed its dark side. When everything is connected, everything can fail simultaneously. I need to think fast about how to salvage this situation, but I'm realizing how few backup plans I actually have for scenarios like this. Most of my contingency planning assumed that basic digital infrastructure would remain functional."
+ },
+ {
+ "peer": "erin",
+ "content": "Everyone, this is much bigger than our individual work problems. I've been checking news sources on my phone, and this appears to be a massive infrastructure failure affecting multiple cloud service providers across the entire region. Millions of businesses, government agencies, hospitals, and schools are experiencing simultaneous outages. The AI startup I'm working with just called in a panic - their entire customer base is affected because their chatbot services depend on the same cloud infrastructure that's failing. But here's what's really concerning: this isn't just about lost productivity or missed deadlines. Critical infrastructure systems are going down - traffic management systems, emergency services dispatch, medical records systems, power grid monitoring. We're witnessing the vulnerability of what scholars call 'technological civilization' - the degree to which our society depends on complex technical systems that most people don't understand and can't control. As Jacques Ellul wrote in 'The Technological Society': 'Technique has become autonomous; it has fashioned an omnivorous world which obeys its own laws and which has renounced all tradition.' Right now, that autonomous technical world is failing, and we're seeing what happens when the technological systems we've built become too complex for anyone to fully comprehend or quickly repair."
+ },
+ {
+ "peer": "frank",
+ "content": "Erin's right about the scope of this crisis, and it's forcing me to completely reconceptualize what I thought I understood about business resilience and risk management. All the collaborative intelligence and systems thinking we were discussing this morning assumed that our basic technological infrastructure would remain stable. Now I'm realizing how naive that assumption was. My Q3 presentation isn't just postponed - the entire framework for measuring and communicating business performance has been disrupted. How do you present financial results when you can't access financial data? How do you demonstrate operational efficiency when operations have been brought to a halt by technical failures beyond your control? This crisis is revealing fundamental questions about the nature of business value and organizational capability that go far beyond quarterly metrics. As Antifragile author Nassim Taleb argues, truly resilient systems don't just survive shocks - they become stronger because of them. Right now, we have an opportunity to discover whether our organizations and communities have that kind of antifragile character, or whether we've become so dependent on technological systems that we can't function without them. The next few hours will test everything we think we know about crisis management and adaptive capacity."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, your point about antifragility is crucial, and I think it connects to something we need to address immediately: how do we coordinate our response to this crisis when the digital communication systems we normally rely on are compromised? We're fortunate that this group chat seems to still be functioning, but we can't assume it will continue working indefinitely. I propose we establish physical meeting points and analog backup plans for staying in touch and supporting each other through this situation. Charlie, you mentioned needing to help Mrs. Petrosky - that bakery could become a community hub for people who need to coordinate activities without digital systems. Dan, your business expertise could help other local organizations develop contingency plans for operating without their usual technological tools. Erin, your understanding of the broader technological landscape could help people make sense of what's happening and what to expect. Bob, your technical skills might be crucial for helping people recover data and rebuild systems when infrastructure comes back online. As Rebecca Solnit writes in 'A Paradise Built in Hell': 'The recovery of this purpose and the utility of your life is one of the great rewards of disaster.' This crisis is terrible, but it's also an opportunity to discover forms of cooperation and mutual aid that our usual technological mediation often obscures."
+ },
+ {
+ "peer": "bob",
+ "content": "Alice, your idea about establishing physical coordination points is brilliant, and it's making me think about the fundamental differences between centralized and distributed systems. The cloud infrastructure that's failing represents a highly centralized model - when the central nodes go down, everything connected to them becomes inaccessible. But the kind of community-based response you're describing follows a distributed model where resilience comes from having multiple independent nodes that can continue functioning even when other parts of the network fail. I have some technical equipment at home that's not dependent on cloud services - portable radios, offline backup drives, even some old-fashioned paper printouts of critical documentation. More importantly, I know how to set up local mesh networks that could allow small groups of people to communicate even without internet connectivity. This reminds me of what Stewart Brand wrote about in 'How Buildings Learn' - the most resilient systems are those that can degrade gracefully, where the failure of one component doesn't bring down the entire structure. Right now, we need to build that kind of graceful degradation into our response strategy. I suggest we each take responsibility for supporting the people and systems in our immediate physical vicinity, while maintaining loose coordination through whatever communication channels remain available."
+ },
+ {
+ "peer": "charlie",
+ "content": "Bob's technical insights are exactly what we need right now, and they're reinforcing my decision to head immediately to Mrs. Petrosky's bakery. I just called her on my cell phone - thankfully, basic phone service still seems to be working - and she's completely overwhelmed. Her electronic payment systems are down, her inventory management software is inaccessible, and she can't process online orders. But here's what's remarkable: she's not panicking. She told me, 'Charlie, I ran this bakery for fifteen years before I had any computers. I can do it again.' She's already switched to cash-only transactions, pulled out her handwritten recipe books, and started calculating inventory by walking through the storage room with a clipboard. Her regular customers are showing up to help - Mr. Chen brought his own cash register from his restaurant to loan her, and several neighbors are volunteering to hand-deliver orders to elderly customers who can't come to the store. This is exactly what Jane Jacobs meant when she wrote about the 'organized complexity' of healthy communities - when formal systems fail, informal networks of mutual support can often provide more effective solutions. Mrs. Petrosky's bakery is becoming a model for how local businesses can maintain continuity through technological disruption. I'm going to document these analog backup processes so we can share them with other small businesses that might be struggling."
+ },
+ {
+ "peer": "dan",
+ "content": "Charlie, what you're describing at Mrs. Petrosky's bakery is giving me hope and also providing a framework for thinking about how to handle my client situation. I just managed to reach the clients who were flying in for this afternoon's presentation, and instead of canceling the meeting, I'm proposing something completely different. Rather than presenting prepared slides about Q3 performance, I want to use this crisis as a real-time case study in organizational resilience and adaptive management. We'll spend the time working together to develop contingency plans for operating their businesses during extended technological disruptions. This crisis is revealing fundamental truths about business continuity that no PowerPoint presentation could capture. As John Dewey wrote: 'We do not learn from experience... we learn from reflecting on experience.' Right now, we're all experiencing something unprecedented, and the real value will come from collectively reflecting on what this teaches us about the assumptions and dependencies that shape modern business operations. I'm calling this an 'analog strategy session' - no digital tools, just whiteboards, flip charts, and human intelligence applied to understanding how organizations can maintain their core functions when their technological infrastructure fails."
+ },
+ {
+ "peer": "erin",
+ "content": "Dan, your reframing of the client presentation as an analog strategy session is exactly the kind of creative adaptation that this crisis demands. I'm taking a similar approach with the AI startup I'm working with. Instead of focusing on their chatbot services that are currently offline, we're using this downtime to conduct in-person interviews with their customers about their actual needs and preferences. It turns out that many customers have been frustrated with the limitations of automated customer service and would prefer hybrid approaches that combine AI efficiency with human empathy and problem-solving capability. This crisis is providing invaluable market research that we never could have gathered under normal circumstances. As Clayton Christensen wrote in 'The Innovator's Dilemma': 'Disruptive technologies typically enable new markets to emerge.' This infrastructure failure is forcing everyone to discover alternative approaches to meeting customer needs, and some of those alternatives might actually be superior to the digital-first strategies that most companies have been pursuing. I'm documenting everything we learn during this period because I suspect the insights will remain valuable long after the technical systems are restored. This crisis is teaching us about the irreplaceable value of human judgment, local knowledge, and adaptive capacity that can't be automated or centralized."
+ },
+ {
+ "peer": "frank",
+ "content": "Erin, your point about discovering the irreplaceable value of human capabilities during this crisis connects to something I'm realizing about leadership and organizational culture. In normal circumstances, so much of business leadership involves managing digital dashboards, optimizing algorithms, and interpreting data analytics. But right now, none of those tools are available, and we're discovering what leadership actually means when it's stripped down to its essential elements: helping people stay calm under pressure, facilitating creative problem-solving, maintaining clear communication, and inspiring confidence in uncertain situations. I just finished a conference call with our senior management team - we used an old landline conference system that nobody remembered we still had - and the conversation was completely different from our usual meetings. Without PowerPoint slides and data visualizations to focus on, we actually talked to each other about our real concerns, our creative ideas, and our shared values. As Warren Bennis wrote in 'On Becoming a Leader': 'The manager does things right; the leader does the right thing.' This crisis is clarifying what 'the right thing' actually means when all the usual metrics and feedback systems are unavailable. We're discovering that our organizational culture is stronger than we realized, precisely because it doesn't depend entirely on technological mediation."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, your observations about leadership during crisis remind me of something profound that's happening to all of us right now. We're being forced to rediscover forms of intelligence and capability that we've allowed to atrophy during our increasing dependence on digital systems. I just walked to the local library - remember libraries? - and found dozens of people working on projects with physical books, paper, and face-to-face collaboration. There's a different quality of attention and engagement when you can't constantly toggle between browser tabs or check notifications every few minutes. People are making deeper eye contact, listening more carefully, thinking more slowly and thoroughly. As Sherry Turkle writes in 'Reclaiming Conversation': 'We are tempted to think that our little 'sips' of online connection add up to a big gulp of real conversation. But they don't.' This crisis is giving us an unexpected opportunity to rediscover what 'real conversation' actually feels like, and I think we're all feeling both relief and surprise at how satisfying it is. The question is whether we'll remember these lessons and choose to preserve some of these analog practices even after digital systems are restored, or whether we'll just rush back to our previous patterns without reflection."
+ },
+ {
+ "peer": "bob",
+ "content": "Alice, your observation about rediscovering analog intelligence is resonating deeply with my experience of trying to solve technical problems without access to Google, Stack Overflow, or online documentation. I'm having to remember problem-solving approaches that I learned years ago but haven't used recently because digital search made them seem unnecessary. I'm actually thinking more systematically and creatively about debugging strategies when I can't just search for solutions that other people have already documented. There's something valuable about being forced to understand problems from first principles rather than just finding and adapting existing solutions. This reminds me of what Richard Sennett writes about in 'The Craftsman': 'The desire to do something well for its own sake.' When you can't rely on external resources, you have to develop internal capabilities, and there's deep satisfaction in discovering that you're more resourceful and capable than you realized. I've been working with some neighbors to set up that local mesh network I mentioned, and the process of explaining technical concepts without being able to reference online tutorials is forcing me to understand them more thoroughly myself. Teaching and learning become much more personal and contextual when they can't be mediated by search engines and video tutorials."
+ },
+ {
+ "peer": "charlie",
+ "content": "Bob, your experience with mesh networking and analog problem-solving perfectly captures what I'm observing at Mrs. Petrosky's bakery. She's teaching a group of younger customers how to calculate recipe proportions by hand, how to judge fermentation timing by smell and touch, how to manage inventory without digital tracking systems. These aren't just backup skills for emergency situations - they're forms of knowledge that provide deeper understanding of the underlying processes that digital systems usually automate. One of the customers, a college student studying business, told me that watching Mrs. Petrosky manage her operation manually has taught her more about supply chain management and customer service than her entire semester of coursework. As Matthew Crawford writes in 'Shop Class as Soulcraft': 'The satisfactions of manifesting oneself concretely in the world through manual competence have been known to make a man quiet and easy.' There's something profound about working with your hands, engaging directly with physical materials and processes, solving problems through experimentation rather than research. This crisis is creating unexpected opportunities for intergenerational knowledge transfer and skill development that our normal technological mediation often prevents. I'm documenting not just the business continuity processes, but also the learning and teaching methods that emerge when people have to rely on direct experience and human-to-human knowledge sharing."
+ },
+ {
+ "peer": "dan",
+ "content": "Charlie, your documentation of intergenerational knowledge transfer at the bakery is capturing something crucial about this crisis that I'm also seeing in my analog strategy session with clients. When you remove the digital intermediation that usually structures business meetings, you discover how much tacit knowledge and intuitive understanding senior executives have developed over decades of experience. Without PowerPoint slides to hide behind, people are sharing stories, drawing diagrams by hand, and engaging in the kind of collaborative sense-making that builds genuine understanding rather than just information transfer. One client, a CEO who's usually focused on data analytics and optimization algorithms, spent an hour drawing process flow diagrams on a whiteboard and explaining the human relationships and informal practices that actually make his organization function. As Michael Polanyi wrote: 'We can know more than we can tell.' This crisis is creating space for sharing the kinds of knowledge that resist digital codification - the subtle judgments, contextual understanding, and relational intelligence that experienced practitioners develop but rarely articulate explicitly. I'm beginning to think that some of our most important business capabilities have been gradually weakened by our increasing reliance on digital systems that prioritize measurable data over experiential wisdom."
+ },
+ {
+ "peer": "erin",
+ "content": "Dan, your insights about tacit knowledge and experiential wisdom connect to something fascinating I'm discovering in these face-to-face customer interviews. People are sharing concerns and preferences about AI and automation that they've never expressed in surveys or online feedback forms. Without the mediation of digital interfaces, conversations become more nuanced and honest. Customers are telling me that they appreciate AI efficiency for routine tasks, but they want human judgment and empathy for complex problems or emotionally sensitive situations. They're describing subtle cues and contextual factors that influence their satisfaction with customer service - tone of voice, facial expressions, willingness to deviate from scripts when situations require flexibility. As Ray Oldenburg writes in 'The Great Good Place': 'What suburbia cries for are the means for people to gather easily, inexpensively, regularly, and pleasurably.' This crisis is creating temporary 'great good places' where people can have the kinds of conversations that build genuine understanding and community connection. I'm realizing that some of the most valuable insights about human-AI collaboration are only accessible through unmediated human conversation. The challenge will be figuring out how to preserve and integrate these insights when digital systems are restored."
+ },
+ {
+ "peer": "frank",
+ "content": "Erin, your observation about conversations becoming more nuanced without digital mediation is making me rethink fundamental assumptions about business intelligence and decision-making. This afternoon's analog strategy session revealed organizational capabilities and stakeholder relationships that never show up in our usual data analytics. When you're working with whiteboards and flip charts instead of interactive dashboards, people focus on different kinds of information - long-term patterns rather than daily fluctuations, qualitative factors rather than quantitative metrics, systemic relationships rather than isolated variables. One client described market dynamics and competitive positioning in ways that captured complexity and nuance that our sophisticated business intelligence tools completely miss. As James C. Scott writes in 'Seeing Like a State': 'Certain forms of knowledge and control require a narrowing of vision. The great advantage of such tunnel vision is that it brings into sharp focus certain limited aspects of an otherwise far too complex and unwieldy reality.' Our digital tools create tunnel vision that helps us manage specific aspects of business performance, but this crisis is revealing how much broader understanding we sacrifice for that analytical precision. The challenge isn't choosing between digital and analog approaches, but finding ways to integrate the strengths of both without losing the contextual intelligence that emerges through direct human engagement."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, your point about integrating digital precision with contextual intelligence raises what might be the most important question this crisis is asking us: what do we want to preserve about this experience when normal technological systems are restored? I've been thinking about this in terms of what the Greeks called 'kairos' - not just chronological time, but the right or opportune moment for something to happen. This crisis represents a kairos moment for reconsidering our relationship with technology and rediscovering human capabilities that we've been gradually outsourcing to digital systems. The challenge is that once the crisis passes and technological convenience is restored, it will be very tempting to simply return to previous patterns without reflection. As SΓΈren Kierkegaard wrote: 'Life can only be understood backwards; but it must be lived forwards.' Right now, we're living through something that we'll only fully understand in retrospect, but we have the opportunity to be intentional about what lessons we want to carry forward. I propose that we commit to regular analog gatherings even after this crisis ends - monthly meetings where we deliberately set aside digital tools and focus on the kinds of conversation and collaboration that we're rediscovering right now. These could become laboratories for exploring hybrid approaches that combine technological efficiency with human wisdom."
+ },
+ {
+ "peer": "bob",
+ "content": "Alice, your proposal for regular analog gatherings is exactly what we need to institutionalize the insights from this crisis, and it connects to something I've been realizing about the nature of technical expertise and problem-solving. The mesh network I've been setting up with neighbors has become much more than an emergency communication system - it's becoming a platform for collaborative learning about technology, community resilience, and alternative approaches to digital connectivity. People are asking questions about how internet infrastructure actually works, how data travels between devices, what happens when centralized systems fail. These conversations are developing a kind of technological literacy that goes beyond just knowing how to use applications or devices. As Ursula Franklin writes in 'The Real World of Technology': 'Technology is not the sum of the artifacts, of the wheels and gears, of the rails and electronic transmitters. Technology is a system. It entails far more than its individual material components.' Understanding technology as a system means understanding its social, economic, and political implications, not just its technical functionality. This crisis is creating opportunities for that kind of systemic understanding that normal technology education rarely provides. I want to continue these community workshops even after the crisis ends, focusing on building technological resilience and democratic participation in decisions about how digital systems shape our communities."
+ },
+ {
+ "peer": "charlie",
+ "content": "Bob, your vision for community workshops on technological literacy dovetails perfectly with what Mrs. Petrosky and I have been discussing about the bakery's role as a community hub. She's realized that her analog backup systems during this crisis have attracted customers who don't usually come to the bakery - people who needed a place to work without internet, families who wanted to buy food with cash, neighbors who were looking for information about local conditions. The bakery has temporarily become what sociologists call a 'third place' - neither home nor work, but a community gathering space that serves social functions beyond its primary business purpose. Mrs. Petrosky wants to preserve some of these community functions even after digital systems are restored. We're redesigning the website to include features that support in-person community building - a bulletin board for local events, a skill-sharing network where people can offer to teach or learn from each other, a community resilience resource hub with information about analog backup systems for local emergencies. As Wendell Berry writes: 'A culture is not a collection of relics or ornaments, but a practical necessity.' The culture of mutual aid and local self-reliance that's emerging during this crisis isn't just nostalgic romanticism - it's a practical necessity for building communities that can thrive regardless of technological disruptions. The bakery website will celebrate and support both digital convenience and analog resilience."
+ },
+ {
+ "peer": "dan",
+ "content": "Charlie, your integration of digital and analog community functions through the bakery website represents exactly the kind of hybrid thinking that I believe this crisis is teaching us across all sectors. My clients and I have spent the afternoon developing what we're calling 'antifragile business models' - organizational structures that not only survive technological disruptions but actually become stronger through them. The key insight is that resilience comes not from choosing between digital efficiency and analog backup systems, but from creating dynamic integration between both approaches. Companies need digital tools for scale and efficiency, but they also need analog capabilities for adaptation and crisis response. Most importantly, they need human judgment and relational intelligence to know when to emphasize which approach. As Nassim Taleb writes: 'Antifragility is beyond resilience or robustness. The resilient resists shocks and stays the same; the antifragile gets better.' The businesses that will thrive in an increasingly complex and unpredictable technological landscape are those that develop this kind of antifragile integration between human and digital capabilities. The crisis has shown us that our most valuable asset isn't our technological infrastructure - it's our capacity for creative adaptation and collaborative problem-solving when that infrastructure fails."
+ },
+ {
+ "peer": "erin",
+ "content": "Dan, your concept of antifragile business models perfectly captures what I've learned about human-AI collaboration during this crisis. The AI startup I'm working with has discovered that their most satisfied customers are those who understand the technology's capabilities and limitations well enough to use it strategically rather than dependently. When the AI systems went offline, these customers didn't panic because they had developed hybrid workflows that combined automated efficiency with human judgment and creativity. They knew when to rely on AI for routine tasks and when to trust human intuition for complex decisions. This crisis has revealed that the future of AI isn't about replacing human intelligence, but about developing more sophisticated forms of human-machine collaboration. As Andy Clark writes in 'Extended Mind': 'We humans are natural-born cyborgs, forever ready to merge fluidly with nonbiological tools and aids.' But becoming skillful cyborgs requires understanding both our human capabilities and our technological tools well enough to integrate them thoughtfully rather than just defaulting to whatever is most convenient or impressive. The most valuable AI applications will be those that enhance human judgment rather than replacing it, and the most successful professionals will be those who develop this kind of hybrid intelligence."
+ },
+ {
+ "peer": "frank",
+ "content": "Erin, your insights about hybrid human-AI intelligence point toward what I think might be the most important outcome of this crisis - a more mature and nuanced understanding of the relationship between technological capability and human value. This afternoon's analog strategy session revealed that our most successful business initiatives have always depended on forms of intelligence that resist automation: contextual judgment, creative problem-solving, empathetic communication, ethical reasoning, adaptive leadership. Digital tools can amplify these capabilities, but they can't replace them. The crisis has shown us that organizations with strong human capabilities can adapt to technological disruptions, while organizations that have outsourced too much intelligence to digital systems become fragile when those systems fail. As Peter Drucker wrote: 'Management is doing things right; leadership is doing the right things.' The challenge for business leaders in an age of increasing automation is developing the judgment to know what should be automated for efficiency and what should remain human for resilience and adaptation. This crisis has been an intensive course in that kind of strategic thinking. I believe the companies that emerge stronger from this experience will be those that use it as an opportunity to develop more sophisticated integration between human wisdom and technological power."
+ },
+ {
+ "peer": "alice",
+ "content": "Frank, as I reflect on this extraordinary day and the conversations we've shared during this crisis, I'm struck by how much we've learned not just about technological resilience, but about human resilience and the forms of intelligence that emerge through collaboration and mutual support. This morning began with individual reflections on the meaning of work and the challenge of finding purpose in routine activities. The crisis forced us to discover that our individual projects and challenges are deeply interconnected, and that our most important capabilities aren't the ones we exercise alone with digital tools, but the ones we develop together through conversation, creativity, and collective problem-solving. As Martin Buber wrote: 'All real living is meeting.' Today has been full of real meetings - not just our digital conversation, but the physical gatherings that each of us has facilitated in response to the crisis. Bob's mesh networking workshops, Charlie's community organizing at the bakery, Dan's analog strategy sessions, Erin's face-to-face customer interviews, Frank's leadership team conversations, my library collaborations - all of these represent forms of intelligence and capability that only emerge through genuine human encounter. The question now is whether we'll remember these lessons and continue to cultivate these capabilities, or whether we'll forget them in the rush to restore normal technological convenience. I believe this crisis has shown us possibilities for ways of working and living that are both more resilient and more satisfying than what we've normalized. The real challenge isn't recovering from this crisis, but using it as a catalyst for creating something better."
+ }
+ ]
+ }
+ },
+ "queries": [],
+ "get_context_calls": [
+ {
+ "session": "session1",
+ "summary": true
+ }
+ ]
+}
diff --git a/tests/bench/tests/summary_multi_session.json b/tests/bench/tests/summary_multi_session.json
new file mode 100644
index 00000000..89c1ee46
--- /dev/null
+++ b/tests/bench/tests/summary_multi_session.json
@@ -0,0 +1,251 @@
+{
+ "sessions": {
+ "session1": {
+ "messages": [
+ {
+ "peer": "alice",
+ "content": "Hello, how are you?"
+ },
+ {
+ "peer": "bob",
+ "content": "I'm good, thank you!"
+ },
+ {
+ "peer": "alice",
+ "content": "I'm going to share some of my favorite numbers with you now."
+ },
+ {
+ "peer": "alice",
+ "content": "7"
+ },
+ {
+ "peer": "alice",
+ "content": "74"
+ },
+ {
+ "peer": "alice",
+ "content": "12"
+ },
+ {
+ "peer": "alice",
+ "content": "8"
+ },
+ {
+ "peer": "alice",
+ "content": "2"
+ },
+ {
+ "peer": "alice",
+ "content": "3"
+ },
+ {
+ "peer": "alice",
+ "content": "14"
+ },
+ {
+ "peer": "alice",
+ "content": "24"
+ },
+ {
+ "peer": "alice",
+ "content": "37"
+ },
+ {
+ "peer": "alice",
+ "content": "What's your favorite number?"
+ },
+ {
+ "peer": "bob",
+ "content": "7"
+ },
+ {
+ "peer": "alice",
+ "content": "Glad to hear it. Here's a bunch of Lorem Ipsum text I found on the internet: Lorem ipsum dolor sit amet, consectetur adipiscing elit."
+ },
+ {
+ "peer": "alice",
+ "content": "Vivamus sodales arcu ut dolor vulputate mollis. Nulla turpis elit, tempus vitae enim in, eleifend dictum dui. Fusce id vulputate augue. Morbi in elit elit. Fusce consectetur at odio lacinia elementum. Donec sed erat ante. Quisque ac massa lacus. Cras at sollicitudin magna. Donec auctor ut magna nec iaculis."
+ },
+ {
+ "peer": "alice",
+ "content": "Etiam tincidunt consequat convallis. Nulla metus ligula, semper ac nunc id, porttitor mattis augue. Sed imperdiet nunc vitae mauris fermentum pretium. Quisque quis massa non tortor ultricies rutrum cursus at augue. Ut porta pulvinar enim et pharetra. Etiam tincidunt dolor nisl, eu aliquet odio imperdiet vel."
+ },
+ {
+ "peer": "alice",
+ "content": "Suspendisse porttitor leo odio, sed viverra nisl facilisis vitae. Aliquam eleifend mollis porta. Integer pulvinar mollis tempus. Donec consectetur condimentum neque non auctor. Sed nec diam sapien. Suspendisse et pharetra mi. Vivamus venenatis pharetra nisl, vitae luctus lorem fringilla at."
+ },
+ {
+ "peer": "alice",
+ "content": "Nullam lobortis nibh eget magna semper, aliquet volutpat purus tempor. Integer aliquet eleifend nisl, in pretium nibh aliquam vitae. In posuere sodales purus, sit amet dapibus tortor sollicitudin ut. Nulla facilisi. Sed ligula nulla, facilisis eu ligula in, sodales hendrerit dui."
+ },
+ {
+ "peer": "alice",
+ "content": "Donec laoreet, nisl ut imperdiet tincidunt, magna nulla ultrices lectus, quis pulvinar erat enim vel magna. Aliquam vulputate auctor efficitur. Aenean vitae risus metus. Nulla varius condimentum volutpat. Aenean ligula enim, fermentum vel iaculis in, mollis non massa."
+ },
+ {
+ "peer": "alice",
+ "content": "Nulla maximus, nunc suscipit consequat condimentum, dolor ligula rhoncus quam, eu lacinia eros ex id nibh. Nam vitae ligula arcu. Ut a tellus sit amet libero fermentum vehicula. Cras sollicitudin nibh in odio convallis, vitae aliquam tellus dapibus."
+ },
+ {
+ "peer": "alice",
+ "content": "Etiam commodo ipsum aliquam diam maximus, vel tristique eros gravida. Integer viverra iaculis aliquet. Aliquam molestie enim quis mauris aliquet, et dictum velit rhoncus. Sed efficitur enim in ullamcorper ullamcorper. Vestibulum urna leo, tincidunt a lectus et, viverra pellentesque tortor. Aenean pretium tortor nunc, eget vehicula nulla sollicitudin et. Aliquam erat volutpat."
+ },
+ {
+ "peer": "bob",
+ "content": "Wow, that's a lot of text! Here's some Lorem Ipsum that I like: Lorem ipsum dolor sit amet, consectetur adipiscing elit."
+ },
+ {
+ "peer": "bob",
+ "content": "Donec tincidunt, sem sed volutpat tempor, nisl nulla congue elit, nec gravida mi velit nec felis. Mauris sit amet ultrices ipsum. Cras non velit at quam auctor congue quis sed sem."
+ },
+ {
+ "peer": "bob",
+ "content": "Quisque ut neque maximus quam ornare cursus eget vitae ipsum. Morbi elit mi, vulputate vel condimentum tincidunt, lobortis ut nulla. Nunc tortor enim, porta vitae posuere sit amet, rutrum vel purus."
+ },
+ {
+ "peer": "bob",
+ "content": "Integer tincidunt ipsum sem, et suscipit quam tempus vel. Vivamus rutrum nisi sed vestibulum congue. Maecenas laoreet imperdiet pulvinar. Vivamus vitae lobortis ex."
+ },
+ {
+ "peer": "bob",
+ "content": "Nullam vitae mattis elit, quis sodales magna. Nunc dolor nunc, scelerisque nec tellus at, finibus euismod mauris. Donec quis odio dui. In a dui libero."
+ },
+ {
+ "peer": "bob",
+ "content": "Mauris pellentesque felis sed eros porttitor, eget ultricies erat cursus. Morbi a viverra nulla, at hendrerit ipsum. Pellentesque eleifend, sapien id fringilla feugiat, massa justo bibendum ligula, sed condimentum elit ipsum ut nibh."
+ },
+ {
+ "peer": "bob",
+ "content": "In erat ipsum, consectetur nec turpis ut, finibus hendrerit lacus. Morbi elementum efficitur hendrerit. Fusce pellentesque dolor urna, quis luctus est tincidunt vitae."
+ },
+ {
+ "peer": "bob",
+ "content": "Maecenas imperdiet diam eu mi tempus sollicitudin. Maecenas luctus, est ut feugiat scelerisque, nisl diam mollis sem, non scelerisque mi ligula vel odio. Nulla aliquet orci non purus pellentesque, quis consectetur nulla ornare."
+ },
+ {
+ "peer": "bob",
+ "content": "Mauris euismod dui dapibus aliquet eleifend. Curabitur et quam dui. Phasellus nisi libero, cursus eget ultrices in, rutrum sit amet risus. Sed quam purus, ultricies nec varius porttitor, ullamcorper consectetur ex."
+ },
+ {
+ "peer": "bob",
+ "content": "Curabitur in quam in nulla ultricies sodales eget sit amet ligula. Aenean odio tellus, ullamcorper non sem non, cursus volutpat lectus. Nulla non nisl molestie, tempor sem sit amet, molestie tortor."
+ },
+ {
+ "peer": "bob",
+ "content": "Proin blandit elit a odio mollis tempus. Donec convallis sed leo at convallis. Integer ac magna posuere, convallis sapien tincidunt, efficitur sapien. Suspendisse ultrices auctor justo, vitae tempor nibh ullamcorper vel."
+ },
+ {
+ "peer": "bob",
+ "content": "Fusce molestie imperdiet ornare. Donec laoreet urna sed urna consectetur tempor. Aenean tempus vitae diam non venenatis. Sed in convallis erat. Ut non sodales nisi."
+ },
+ {
+ "peer": "bob",
+ "content": "Praesent euismod id massa eget vulputate. Suspendisse id molestie tortor. Duis ac pretium neque. Curabitur vulputate volutpat tellus, at dictum risus tincidunt quis."
+ },
+ {
+ "peer": "bob",
+ "content": "Nam pellentesque sed elit eget sollicitudin. Proin vestibulum efficitur risus, eget tempus sapien posuere eu. In porta nec nisl sed iaculis. Integer a elementum risus."
+ }
+ ]
+ },
+ "session2": {
+ "messages": [
+ {
+ "peer": "alice",
+ "content": "Hello, how are you?"
+ },
+ {
+ "peer": "bob",
+ "content": "I'm good, thank you!"
+ },
+ {
+ "peer": "alice",
+ "content": "I'm going to share some of my favorite numbers with you now."
+ },
+ {
+ "peer": "alice",
+ "content": "7"
+ },
+ {
+ "peer": "alice",
+ "content": "74"
+ },
+ {
+ "peer": "alice",
+ "content": "12"
+ },
+ {
+ "peer": "alice",
+ "content": "8"
+ },
+ {
+ "peer": "alice",
+ "content": "2"
+ },
+ {
+ "peer": "alice",
+ "content": "3"
+ },
+ {
+ "peer": "alice",
+ "content": "14"
+ },
+ {
+ "peer": "alice",
+ "content": "24"
+ },
+ {
+ "peer": "alice",
+ "content": "37"
+ },
+ {
+ "peer": "alice",
+ "content": "What's your favorite number?"
+ },
+ {
+ "peer": "bob",
+ "content": "7"
+ },
+ {
+ "peer": "alice",
+ "content": "Glad to hear it. Here's a bunch of Lorem Ipsum text I found on the internet: Lorem ipsum dolor sit amet, consectetur adipiscing elit."
+ },
+ {
+ "peer": "alice",
+ "content": "Vivamus sodales arcu ut dolor vulputate mollis. Nulla turpis elit, tempus vitae enim in, eleifend dictum dui. Fusce id vulputate augue. Morbi in elit elit. Fusce consectetur at odio lacinia elementum. Donec sed erat ante. Quisque ac massa lacus. Cras at sollicitudin magna. Donec auctor ut magna nec iaculis."
+ },
+ {
+ "peer": "alice",
+ "content": "Etiam tincidunt consequat convallis. Nulla metus ligula, semper ac nunc id, porttitor mattis augue. Sed imperdiet nunc vitae mauris fermentum pretium. Quisque quis massa non tortor ultricies rutrum cursus at augue. Ut porta pulvinar enim et pharetra. Etiam tincidunt dolor nisl, eu aliquet odio imperdiet vel."
+ },
+ {
+ "peer": "alice",
+ "content": "Suspendisse porttitor leo odio, sed viverra nisl facilisis vitae. Aliquam eleifend mollis porta. Integer pulvinar mollis tempus. Donec consectetur condimentum neque non auctor. Sed nec diam sapien. Suspendisse et pharetra mi. Vivamus venenatis pharetra nisl, vitae luctus lorem fringilla at."
+ },
+ {
+ "peer": "alice",
+ "content": "Nullam lobortis nibh eget magna semper, aliquet volutpat purus tempor. Integer aliquet eleifend nisl, in pretium nibh aliquam vitae. In posuere sodales purus, sit amet dapibus tortor sollicitudin ut. Nulla facilisi. Sed ligula nulla, facilisis eu ligula in, sodales hendrerit dui."
+ },
+ {
+ "peer": "alice",
+ "content": "Donec laoreet, nisl ut imperdiet tincidunt, magna nulla ultrices lectus, quis pulvinar erat enim vel magna. Aliquam vulputate auctor efficitur. Aenean vitae risus metus. Nulla varius condimentum volutpat. Aenean ligula enim, fermentum vel iaculis in, mollis non massa."
+ },
+ {
+ "peer": "alice",
+ "content": "Nulla maximus, nunc suscipit consequat condimentum, dolor ligula rhoncus quam, eu lacinia eros ex id nibh. Nam vitae ligula arcu. Ut a tellus sit amet libero fermentum vehicula. Cras sollicitudin nibh in odio convallis, vitae aliquam tellus dapibus."
+ }
+ ]
+ }
+ },
+ "queries": [],
+ "get_context_calls": [
+ {
+ "session": "session1",
+ "summary": true
+ },
+ {
+ "session": "session2",
+ "summary": true
+ }
+ ]
+}
diff --git a/tests/bench/tests/summary_short_messages.json b/tests/bench/tests/summary_short_messages.json
new file mode 100644
index 00000000..14fe50fc
--- /dev/null
+++ b/tests/bench/tests/summary_short_messages.json
@@ -0,0 +1,307 @@
+{
+ "sessions": {
+ "session1": {
+ "messages": [
+ {
+ "peer": "alice",
+ "content": "Good morning everyone! Ready for another Monday?"
+ },
+ {
+ "peer": "bob",
+ "content": "Ugh, barely. Need more coffee β"
+ },
+ {
+ "peer": "charlie",
+ "content": "I'm excited! Starting a new project today"
+ },
+ {
+ "peer": "dan",
+ "content": "What's the project about?"
+ },
+ {
+ "peer": "charlie",
+ "content": "Website redesign for a local bakery"
+ },
+ {
+ "peer": "erin",
+ "content": "That sounds fun! I love bakeries"
+ },
+ {
+ "peer": "frank",
+ "content": "Morning all. Traffic was terrible today"
+ },
+ {
+ "peer": "alice",
+ "content": "Same here. Construction on Main St"
+ },
+ {
+ "peer": "bob",
+ "content": "That's why I bike to work"
+ },
+ {
+ "peer": "dan",
+ "content": "Lucky you. I have client meetings all day"
+ },
+ {
+ "peer": "erin",
+ "content": "In person or zoom?"
+ },
+ {
+ "peer": "dan",
+ "content": "Mix of both. 3 in person, 2 virtual"
+ },
+ {
+ "peer": "frank",
+ "content": "Busy day! I have a presentation at 2pm"
+ },
+ {
+ "peer": "charlie",
+ "content": "What's the presentation about?"
+ },
+ {
+ "peer": "frank",
+ "content": "Q3 sales numbers. Hoping for good news"
+ },
+ {
+ "peer": "alice",
+ "content": "Fingers crossed! π€"
+ },
+ {
+ "peer": "bob",
+ "content": "Anyone else working late today?"
+ },
+ {
+ "peer": "erin",
+ "content": "I might be. Deadline on Thursday"
+ },
+ {
+ "peer": "charlie",
+ "content": "What are you working on?"
+ },
+ {
+ "peer": "erin",
+ "content": "Marketing campaign for a tech startup"
+ },
+ {
+ "peer": "dan",
+ "content": "Cool! What kind of tech?"
+ },
+ {
+ "peer": "erin",
+ "content": "AI chatbots for customer service"
+ },
+ {
+ "peer": "alice",
+ "content": "Very relevant these days"
+ },
+ {
+ "peer": "frank",
+ "content": "Speaking of AI, anyone seen the latest ChatGPT updates?"
+ },
+ {
+ "peer": "bob",
+ "content": "Yeah! The voice mode is crazy good"
+ },
+ {
+ "peer": "charlie",
+ "content": "I use it for coding help sometimes"
+ },
+ {
+ "peer": "dan",
+ "content": "Same. Great for debugging"
+ },
+ {
+ "peer": "erin",
+ "content": "Lunch plans anyone?"
+ },
+ {
+ "peer": "alice",
+ "content": "I brought leftover pasta"
+ },
+ {
+ "peer": "bob",
+ "content": "There's a new sushi place downtown"
+ },
+ {
+ "peer": "frank",
+ "content": "Ooh, what's it called?"
+ },
+ {
+ "peer": "bob",
+ "content": "Sakura Kitchen. Just opened last week"
+ },
+ {
+ "peer": "charlie",
+ "content": "I'm in! Anyone else want to join?"
+ },
+ {
+ "peer": "dan",
+ "content": "Can't, have a lunch meeting π"
+ },
+ {
+ "peer": "erin",
+ "content": "I'll come! Love trying new places"
+ },
+ {
+ "peer": "frank",
+ "content": "Count me in too"
+ },
+ {
+ "peer": "alice",
+ "content": "Have fun! I'll stick with my pasta today"
+ },
+ {
+ "peer": "bob",
+ "content": "Meet at the lobby at 12:30?"
+ },
+ {
+ "peer": "charlie",
+ "content": "Perfect timing"
+ },
+ {
+ "peer": "erin",
+ "content": "See you there!"
+ },
+ {
+ "peer": "frank",
+ "content": "Looking forward to it"
+ },
+ {
+ "peer": "dan",
+ "content": "Back from lunch meeting. How was the sushi?"
+ },
+ {
+ "peer": "bob",
+ "content": "Amazing! The salmon was so fresh"
+ },
+ {
+ "peer": "charlie",
+ "content": "Best spicy tuna roll I've had in ages"
+ },
+ {
+ "peer": "erin",
+ "content": "And the service was super fast"
+ },
+ {
+ "peer": "frank",
+ "content": "Definitely going back soon"
+ },
+ {
+ "peer": "alice",
+ "content": "Sounds great! Maybe next time"
+ },
+ {
+ "peer": "dan",
+ "content": "Evening plans anyone?"
+ },
+ {
+ "peer": "bob",
+ "content": "Gym, then Netflix probably"
+ },
+ {
+ "peer": "charlie",
+ "content": "Working on some personal coding projects"
+ },
+ {
+ "peer": "erin",
+ "content": "Date night with my partner π"
+ },
+ {
+ "peer": "frank",
+ "content": "Nice! Anywhere special?"
+ },
+ {
+ "peer": "erin",
+ "content": "That new Italian place on 5th street"
+ },
+ {
+ "peer": "alice",
+ "content": "I heard great things about their tiramisu"
+ },
+ {
+ "peer": "dan",
+ "content": "I'm planning to catch up on reading"
+ },
+ {
+ "peer": "bob",
+ "content": "What book?"
+ },
+ {
+ "peer": "dan",
+ "content": "Atomic Habits. Finally getting around to it"
+ },
+ {
+ "peer": "charlie",
+ "content": "Great book! Really helped me with morning routines"
+ },
+ {
+ "peer": "frank",
+ "content": "I should read that too"
+ },
+ {
+ "peer": "alice",
+ "content": "Anyone watching anything good lately?"
+ },
+ {
+ "peer": "bob",
+ "content": "Just started The Bear. So good!"
+ },
+ {
+ "peer": "erin",
+ "content": "Love that show! Season 3 was intense"
+ },
+ {
+ "peer": "charlie",
+ "content": "I'm rewatching The Office for the 100th time"
+ },
+ {
+ "peer": "frank",
+ "content": "Classic choice π"
+ },
+ {
+ "peer": "dan",
+ "content": "Has anyone tried that new board game cafe?"
+ },
+ {
+ "peer": "alice",
+ "content": "Which one?"
+ },
+ {
+ "peer": "dan",
+ "content": "Game Night downtown. They have hundreds of games"
+ },
+ {
+ "peer": "bob",
+ "content": "Sounds fun! Weekend group activity?"
+ },
+ {
+ "peer": "charlie",
+ "content": "I'm free Saturday afternoon"
+ },
+ {
+ "peer": "erin",
+ "content": "Me too! What time?"
+ },
+ {
+ "peer": "frank",
+ "content": "How about 2pm Saturday?"
+ },
+ {
+ "peer": "alice",
+ "content": "Works for me!"
+ },
+ {
+ "peer": "dan",
+ "content": "Perfect! I'll make a reservation"
+ }
+ ]
+ }
+ },
+ "queries": [],
+ "get_context_calls": [
+ {
+ "session": "session1",
+ "summary": true
+ }
+ ]
+}
diff --git a/tests/bench/tests/summary_trivial.json b/tests/bench/tests/summary_trivial.json
index 8f0d68e2..0d01be56 100644
--- a/tests/bench/tests/summary_trivial.json
+++ b/tests/bench/tests/summary_trivial.json
@@ -172,11 +172,6 @@
"summary": true,
"max_tokens": 50
},
- {
- "session": "session1",
- "summary": true,
- "max_tokens": 100
- },
{
"session": "session1",
"summary": true,
@@ -187,11 +182,6 @@
"summary": true,
"max_tokens": 500
},
- {
- "session": "session1",
- "summary": true,
- "max_tokens": 800
- },
{
"session": "session1",
"summary": true,
@@ -200,12 +190,11 @@
{
"session": "session1",
"summary": true,
- "max_tokens": 1200
+ "max_tokens": 2500
},
{
"session": "session1",
- "summary": true,
- "max_tokens": 2500
+ "summary": true
}
]
}