times-square-integration
About
This skill provides integration patterns for working with Times Square notebook execution system. Use it when implementing SSE updates, handling URL parameters, setting up GitHub PR previews, or working with the Times Square API. It includes context providers, data fetching hooks, mock API endpoints, and page routing patterns for notebook display and execution.
Documentation
Times Square Integration
Times Square is a notebook execution system integrated into the squareone app for displaying computational notebooks.
Core Concepts
- Pages: Notebooks that can be executed and displayed
- Parameters: URL-based parameters for notebook execution
- SSE (Server-Sent Events): Real-time updates during execution
- GitHub PR Previews: Preview notebooks from pull requests
Context Providers
TimesSquareUrlParametersContext
Manages URL-based state for Times Square pages.
import { TimesSquareUrlParametersContext } from '../contexts/TimesSquareUrlParametersContext';
// Provider setup (usually in page)
<TimesSquareUrlParametersContext.Provider value={urlParams}>
<TimesSquarePage />
</TimesSquareUrlParametersContext.Provider>
// Usage in components
const { getParameter, setParameter } = useContext(TimesSquareUrlParametersContext);
const value = getParameter('myParam');
setParameter('myParam', 'newValue');
TimesSquareHtmlEventsContext
Manages real-time SSE (Server-Sent Events) updates.
import { TimesSquareHtmlEventsContext } from '../contexts/TimesSquareHtmlEventsContext';
// Provider setup
<TimesSquareHtmlEventsContext.Provider value={eventSource}>
<TimesSquarePage />
</TimesSquareHtmlEventsContext.Provider>
// Usage
const events = useContext(TimesSquareHtmlEventsContext);
// events provides real-time updates from notebook execution
Data Fetching Hooks
useTimesSquarePage
Custom hook for fetching Times Square page data.
import { useTimesSquarePage } from '../hooks/useTimesSquarePage';
function MyComponent({ pageSlug }) {
const { data, error, isLoading } = useTimesSquarePage(pageSlug);
if (isLoading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return <div>{data.displayName}</div>;
}
Pattern uses SWR for caching and revalidation.
Routing Patterns
Regular Pages
/times-square/{page-slug}
GitHub PR Previews
/times-square/github-pr/{owner}/{repo}/{commit}
Example:
/times-square/github-pr/lsst-sqre/times-square-demo/abc123
API Routes
Mock API endpoints in development (/pages/api/dev/times-square/):
GET /times-square/api/v1/pages- List pagesGET /times-square/api/v1/pages/:page- Page metadataGET /times-square/api/v1/pages/:page/html- Rendered HTMLGET /times-square/api/v1/pages/:page/htmlstatus- Execution statusGET /times-square/api/v1/pages/:page/htmlevents- SSE endpoint
Mock API Endpoints
For local development without Times Square backend:
// pages/api/dev/times-square/v1/pages/[page]/html.ts
import type { NextApiRequest, NextApiResponse } from 'next';
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
const { page } = req.query;
// Return mock HTML
res.status(200).json({
html: '<div>Mock Times Square page</div>',
parameters: {},
});
}
Page Component Pattern
import { GetServerSideProps } from 'next';
import { useTimesSquarePage } from '../hooks/useTimesSquarePage';
import { TimesSquareUrlParametersContext } from '../contexts/TimesSquareUrlParametersContext';
import { loadAppConfig } from '../lib/config/loader';
type Props = {
pageSlug: string;
};
export default function TimesSquarePage({ pageSlug }: Props) {
const { data, error, isLoading } = useTimesSquarePage(pageSlug);
if (isLoading) return <div>Loading notebook...</div>;
if (error) return <div>Error loading notebook</div>;
return (
<div>
<h1>{data.displayName}</h1>
<div dangerouslySetInnerHTML={{ __html: data.html }} />
</div>
);
}
export const getServerSideProps: GetServerSideProps<Props> = async (context) => {
const appConfig = await loadAppConfig();
const pageSlug = context.params?.page as string;
return {
props: {
appConfig,
pageSlug,
},
};
};
SSE Integration
function TimesSquareLivePage({ pageSlug }) {
const [eventSource, setEventSource] = useState(null);
useEffect(() => {
const es = new EventSource(
`/times-square/api/v1/pages/${pageSlug}/htmlevents`
);
es.onmessage = (event) => {
const data = JSON.parse(event.data);
// Handle real-time updates
console.log('New data:', data);
};
setEventSource(es);
return () => es.close();
}, [pageSlug]);
return (
<TimesSquareHtmlEventsContext.Provider value={eventSource}>
{/* Page content */}
</TimesSquareHtmlEventsContext.Provider>
);
}
Configuration
Times Square URL configured in AppConfig:
# squareone.config.yaml
timesSquareUrl: 'http://localhost:3000/times-square/api' # Dev
# timesSquareUrl: 'https://data.lsst.cloud/times-square/api' # Prod
Access in components:
import { useAppConfig } from '../contexts/AppConfigContext';
const config = useAppConfig();
const timesSquareUrl = config.timesSquareUrl;
Best Practices
- Use context providers for shared state
- Cache with SWR for performance
- Mock APIs for development
- Handle loading states gracefully
- Clean up SSE connections on unmount
- Validate parameters before execution
- Show execution progress with SSE
- Handle errors appropriately
Quick Install
/plugin add https://github.com/lsst-sqre/squareone/tree/main/times-square-integrationCopy and paste this command in Claude Code to install this skill
GitHub 仓库
Related Skills
evaluating-llms-harness
TestingThis Claude Skill runs the lm-evaluation-harness to benchmark LLMs across 60+ standardized academic tasks like MMLU and GSM8K. It's designed for developers to compare model quality, track training progress, or report academic results. The tool supports various backends including HuggingFace and vLLM models.
langchain
MetaLangChain is a framework for building LLM applications using agents, chains, and RAG pipelines. It supports multiple LLM providers, offers 500+ integrations, and includes features like tool calling and memory management. Use it for rapid prototyping and deploying production systems like chatbots, autonomous agents, and question-answering services.
llamaindex
MetaLlamaIndex is a data framework for building RAG-powered LLM applications, specializing in document ingestion, indexing, and querying. It provides key features like vector indices, query engines, and agents, and supports over 300 data connectors. Use it for document Q&A, chatbots, and knowledge retrieval when building data-centric applications.
csv-data-summarizer
MetaThis skill automatically analyzes CSV files to generate comprehensive statistical summaries and visualizations using Python's pandas and matplotlib/seaborn. It should be triggered whenever a user uploads or references CSV data without prompting for analysis preferences. The tool provides immediate insights into data structure, quality, and patterns through automated analysis and visualization.
