stevensDemohandleTelegramMessage.ts7 matches
9293/**
94* Format chat history for Anthropic API
95*/
96function formatChatHistoryForAI(history) {
321bot.on("message", async (ctx) => {
322try {
323// Get Anthropic API key from environment
324const apiKey = Deno.env.get("ANTHROPIC_API_KEY");
325if (!apiKey) {
326console.error("Anthropic API key is not configured.");
327ctx.reply(
328"I apologize, but I'm not properly configured at the moment. Please inform the household administrator."
332333// Initialize Anthropic client
334const anthropic = new Anthropic({ apiKey });
335336// Get message text and user info
502// Set webhook if it is not set yet
503if (!isEndpointSet) {
504await bot.api.setWebhook(req.url, {
505secret_token: SECRET_TOKEN,
506});
stevensDemogetWeather.ts5 matches
27async function generateConciseWeatherSummary(weatherDay) {
28try {
29// Get API key from environment
30const apiKey = Deno.env.get("ANTHROPIC_API_KEY");
31if (!apiKey) {
32console.error("Anthropic API key is not configured.");
33return null;
34}
3536// Initialize Anthropic client
37const anthropic = new Anthropic({ apiKey });
3839const response = await anthropic.messages.create({
stevensDemogenerateFunFacts.ts5 matches
77async function generateFunFacts(previousFacts) {
78try {
79// Get API key from environment
80const apiKey = Deno.env.get("ANTHROPIC_API_KEY");
81if (!apiKey) {
82console.error("Anthropic API key is not configured.");
83return null;
84}
8586// Initialize Anthropic client
87const anthropic = new Anthropic({ apiKey });
8889// Format previous facts for the prompt
stevensDemo.cursorrules10 matches
20### 2. HTTP Vals
2122- Create web APIs and endpoints
23- Handle HTTP requests and responses
24- Example structure:
66- Generate code in TypeScript
67- Add appropriate TypeScript types and interfaces for all data structures
68- Prefer official SDKs or libraries than writing API calls directly
69- Ask the user to supply API or library documentation if you are at all unsure about it
70- **Never bake in secrets into the code** - always use environment variables
71- Include comments explaining complex logic (avoid commenting obvious operations)
190- For AI-generated images, use: `https://maxm-imggenurl.web.val.run/the-description-of-your-image`
191- **Storage:** DO NOT use the Deno KV module for storage
192- **Browser APIs:** DO NOT use the `alert()`, `prompt()`, or `confirm()` methods
193- **Weather Data:** Use open-meteo for weather data (doesn't require API keys) unless otherwise specified
194- **View Source:** Add a view source link with `import.meta.url.replace("esm.town", "val.town")` and include `target="_top"` attribute
195- **Error Debugging:** Add `<script src="https://esm.town/v/std/catch"></script>` to HTML to capture client-side errors
196- **Error Handling:** Only use try...catch when there's a clear local resolution; avoid catches that merely log or return 500s - let errors bubble up with full context
197- **Environment Variables:** Use `Deno.env.get('keyname')` and minimize their use - prefer APIs without keys
198- **Imports:** Use `https://esm.sh` for npm and Deno dependencies to ensure compatibility on server and browser
199- **Storage Strategy:** Only use backend storage if explicitly required; prefer simple static client-side sites
230231### Backend (Hono) Best Practices
232- Hono is the recommended API framework (similar to Express, Flask, or Sinatra)
233- Main entry point should be `backend/index.ts`
234- **Static asset serving:** Use the utility functions to read and serve project files:
251});
252```
253- Create RESTful API routes for CRUD operations
254- Be careful with error handling as Hono tends to swallow errors
255- Always include this snippet at the top-level Hono app to re-throwing errors to see full stack traces:
268- Use React 18.2.0 consistently in all imports and the `@jsxImportSource` pragma
269- Follow the React component pattern from the example project
270- Handle API calls properly with proper error catching
271272### Database Patterns
299- For files in the project, use `readFile` helpers
3003015. **API Design:**
302- `fetch` handler is the entry point for HTTP vals
303- Run the Hono app with `export default app.fetch // This is the entry point for HTTP vals`
stevensDemoApp.tsx8 matches
10import { NotebookView } from "./NotebookView.tsx";
1112const API_BASE = "/api/memories";
13const MEMORIES_PER_PAGE = 20; // Increased from 7 to 20 memories per page
149091// Fetch avatar image
92fetch("/api/images/stevens.jpg")
93.then((response) => {
94if (response.ok) return response.blob();
104105// Fetch wood background
106fetch("/api/images/wood.jpg")
107.then((response) => {
108if (response.ok) return response.blob();
133setError(null);
134try {
135const response = await fetch(API_BASE);
136if (!response.ok) {
137throw new Error(`HTTP error! status: ${response.status}`);
176177try {
178const response = await fetch(API_BASE, {
179method: "POST",
180headers: { "Content-Type": "application/json" },
199200try {
201const response = await fetch(`${API_BASE}/${id}`, {
202method: "DELETE",
203});
231232try {
233const response = await fetch(`${API_BASE}/${editingMemory.id}`, {
234method: "PUT",
235headers: { "Content-Type": "application/json" },
606<div className="font-pixel text-[#f8f1e0]">
607<style jsx>{`
608@import url("https://fonts.googleapis.com/css2?family=Pixelify+Sans&display=swap");
609610@tailwind base;
logoWorkshopOpenMojiindex.tsx10 matches
22const [showEmojiPicker, setShowEmojiPicker] = useState(false);
23
24// API code example
25const [apiCode, setApiCode] = useState("");
26const [sdkCode, setSdkCode] = useState("");
27
54const emojiPickerContainerRef = useRef(null);
55
56// Generate the API URL example whenever the options change
57useEffect(() => {
58// Build the API URL
59const baseUrl = "https://dcm31--1e7e43501a4611f0affa569c3dd06744.web.val.run/";
60const params = new URLSearchParams();
77if (debug) params.append("debug", "true");
78
79const apiUrl = `${baseUrl}?${params.toString()}`;
80setApiCode(`// Using fetch to call the API
81fetch("${apiUrl}")
82.then(response => response.text())
83.then(svgString => {
581<div className="mb-6">
582<div className="flex justify-between items-center mb-2">
583<h3 className="text-lg font-medium">API Usage</h3>
584<button
585onClick={() => copyCode(apiCode)}
586className="px-3 py-1 bg-gray-200 hover:bg-gray-300 text-gray-800 text-sm rounded"
587>
590</div>
591<pre className="bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm">
592{apiCode}
593</pre>
594</div>
logoWorkshopOpenMojisdk.tsx3 matches
130* Create a new instance of the LogoWorkshopSDK
131*
132* @param emojiSdkUrl - Optional custom URL for the EmojiSummarizer API
133*/
134constructor(emojiSdkUrl: string = EMOJI_SDK_URL) {
326bgColor = isValidHexColor(bgColor) ? bgColor : "#ffffff";
327
328// Calculate optimal font sizes using the exact same algorithm as logoAPI Val
329const {
330topFontSize,
366}
367
368// Generate SVG content using the same implementation as logoAPI Val
369const svgContent = generateLogoSVG({
370logoWidth: LOGO_WIDTH,
logoWorkshopOpenMojiSDK_README.md2 matches
1# LogoWorkshopOpenMoji SDK
23This SDK provides direct programmatic access to the LogoWorkshopOpenMoji logo generation engine. Rather than making HTTP API calls, you can use this SDK to generate logos directly in your code.
45## Installation/Import
67## Configuration Options
6869The SDK accepts the same options as the HTTP API:
7071```typescript
logoWorkshopOpenMojiindex.new.tsx10 matches
22const [showEmojiPicker, setShowEmojiPicker] = useState(false);
23
24// API code example
25const [apiCode, setApiCode] = useState("");
26const [sdkCode, setSdkCode] = useState("");
27
54const emojiPickerContainerRef = useRef(null);
55
56// Generate the API URL example whenever the options change
57useEffect(() => {
58// Build the API URL
59const baseUrl = "https://dcm31--1e7e43501a4611f0affa569c3dd06744.web.val.run/";
60const params = new URLSearchParams();
77if (debug) params.append("debug", "true");
78
79const apiUrl = `${baseUrl}?${params.toString()}`;
80setApiCode(`// Using fetch to call the API
81fetch("${apiUrl}")
82.then(response => response.text())
83.then(svgString => {
581<div className="mb-6">
582<div className="flex justify-between items-center mb-2">
583<h3 className="text-lg font-medium">API Usage</h3>
584<button
585onClick={() => copyCode(apiCode)}
586className="px-3 py-1 bg-gray-200 hover:bg-gray-300 text-gray-800 text-sm rounded"
587>
590</div>
591<pre className="bg-gray-100 p-4 rounded-lg overflow-x-auto text-sm">
592{apiCode}
593</pre>
594</div>
45interface ConversionFormProps {
6apiKey: string;
7valUrls: string;
8projectName: string;
9isLoading: boolean;
10onApiKeyChange: (value: string) => void;
11onValUrlsChange: (value: string) => void;
12onProjectNameChange: (value: string) => void;
19isLoadingProjects: boolean;
20projectsError: string | null;
21apiKeyHighlightError: boolean;
22onExistingProjectLabelClick: () => void;
23}
2425export function ConversionForm({
26apiKey,
27valUrls,
28projectName,
29isLoading,
30onApiKeyChange,
31onValUrlsChange,
32onProjectNameChange,
39isLoadingProjects,
40projectsError,
41apiKeyHighlightError,
42onExistingProjectLabelClick,
43}: ConversionFormProps) {
45<form onSubmit={onSubmit}>
46<div className="form-group">
47<label htmlFor="apiKey" className="primary-label">
48<span role="img" aria-label="key" style={{ marginRight: '10px' }}>🔑</span> API Key
49</label>
50<input
51type="password"
52id="apiKey"
53className={apiKeyHighlightError ? "input-error-highlight" : ""}
54value={apiKey}
55onChange={(e) => onApiKeyChange(e.target.value)}
56placeholder="vt_..."
57required
58/>
59{apiKeyHighlightError && (
60<div className="small-text error-text" style={{ marginTop: '5px' }}>
61API Key is required to load existing projects.
62</div>
63)}
64<div className="helper-text" style={{ marginTop: apiKeyHighlightError ? '5px' : 'var(--space-xs)' }}>
65<a href="https://www.val.town/settings/api" target="_blank" rel="noopener noreferrer">
66Get your API key
67</a> with Project + Val Read/Write permissions
68</div>
102</label>
103<label
104style={{ fontWeight: 'normal', display: 'flex', alignItems: 'center', position: 'relative', cursor: !apiKey ? 'pointer' : 'default' }}
105title={!apiKey ? "Enter API key to enable" : isLoadingProjects ? "Loading projects..." : projectsError ? "Error loading projects" : projects.length === 0 ? "No existing projects found" : "Select an existing project"}
106onClick={onExistingProjectLabelClick}
107>
111value="existing"
112checked={creationMode === "existing"}
113onChange={() => { if(apiKey && !isLoadingProjects && !projectsError && projects.length > 0) onCreationModeChange("existing"); }}
114disabled={!apiKey || isLoadingProjects || !!projectsError || projects.length === 0}
115style={{ marginRight: 'var(--space-xs)' }}
116/>
147onChange={(e) => onSelectedProjectIdChange(e.target.value)}
148required={creationMode === "existing"}
149disabled={isLoadingProjects || projects.length === 0 || !apiKey}
150style={{ width: '100%', padding: '10px', fontSize: '14px', marginTop: 'var(--space-xs)' }}
151>