diff --git a/Week13/Day1/codereview.py b/Week13/Day1/codereview.py new file mode 100644 index 00000000..b162807d --- /dev/null +++ b/Week13/Day1/codereview.py @@ -0,0 +1,2318 @@ +import streamlit as st +from langchain_openai import ChatOpenAI +from langchain_core.messages import HumanMessage, SystemMessage, AIMessage +from langchain_core.prompts import ChatPromptTemplate, PromptTemplate +from langchain_core.output_parsers import JsonOutputParser, StrOutputParser, PydanticOutputParser +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain.chains import LLMChain +from langchain.schema import Document +from langchain.memory import ConversationBufferMemory +from langchain.callbacks.base import BaseCallbackHandler +from langchain_core.runnables import RunnablePassthrough, RunnableParallel +from langchain_core.runnables.config import RunnableConfig + +import json +import asyncio +import os +from dataclasses import dataclass, asdict +from typing import List, Dict, Any, Optional, Union +from enum import Enum +from pydantic import BaseModel, Field +import re +from datetime import datetime +import logging +import requests + +# Langsmith integration - initialized at runtime +import langsmith +from dotenv import load_dotenv + +# Global variables for Langsmith +_langsmith_initialized = False +_langsmith_client = None + +def _initialize_langsmith(): + """Initialize Langsmith tracing - called at runtime""" + global _langsmith_initialized, _langsmith_client + + if _langsmith_initialized: + return _langsmith_client + + try: + # Load environment variables + load_dotenv() + + # Check API keys + langsmith_key = os.getenv('LANGSMITH_API_KEY') + if not langsmith_key: + logger.warning("LANGSMITH_API_KEY not found in environment") + return None + + # Create Langsmith client with explicit API key + _langsmith_client = langsmith.Client(api_key=langsmith_key) + + # Set environment variables for tracing (CORRECT format from docs) + os.environ["LANGSMITH_TRACING"] = "true" + os.environ["LANGSMITH_API_KEY"] = langsmith_key + os.environ["LANGSMITH_PROJECT"] = "code-review-app" + # Set for backward compatibility too + os.environ["LANGCHAIN_TRACING_V2"] = "true" + os.environ["LANGCHAIN_PROJECT"] = "code-review-app" + + _langsmith_initialized = True + logger.info("✅ Langsmith tracing initialized successfully") + return _langsmith_client + + except Exception as e: + logger.error(f"Failed to initialize Langsmith: {e}") + return None + +def get_langsmith_client(): + """Get Langsmith client (initialize if needed)""" + return _initialize_langsmith() + +# Configure logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Pydantic models for structured output +class Severity(str, Enum): + CRITICAL = "Critical" + HIGH = "High" + MEDIUM = "Medium" + LOW = "Low" + +class IssueCategory(str, Enum): + SECURITY = "Security" + PERFORMANCE = "Performance" + BUG = "Bug" + STYLE = "Style" + MAINTAINABILITY = "Maintainability" + +class CodeIssue(BaseModel): + """Structured code issue model for LangChain output parsing""" + severity: Severity + category: IssueCategory + line_number: int = Field(description="Line number where issue occurs") + title: str = Field(description="Brief issue title") + description: str = Field(description="Detailed issue description") + suggestion: str = Field(description="How to fix the issue") + code_snippet: Optional[str] = Field(default="", description="Relevant code snippet") + confidence: float = Field(ge=0.0, le=1.0, description="AI confidence in this issue") + +class AnalysisResult(BaseModel): + """Complete analysis result structure""" + issues: List[CodeIssue] + summary: str + quality_score: float = Field(ge=0.0, le=100.0) + model_used: str + analysis_time: float + recommendations: List[str] + token_usage: Dict[str, Union[int, float]] = Field(default_factory=dict) + +# OpenRouter model configurations +OPENROUTER_MODELS = { + # Free Models + "Grok 4 Fast (Free)": { + "id": "x-ai/grok-4-fast:free", + "context": "32K tokens", + "cost": "FREE - No credits required", + "provider": "xAI" + }, + "Grok 4o Mini (Free)": { + "id": "x-ai/grok-4o-mini:free", + "context": "32K tokens", + "cost": "FREE - Fast and efficient", + "provider": "xAI" + }, + + # Anthropic Models + "Claude 3.5 Sonnet": { + "id": "anthropic/claude-3.5-sonnet", + "context": "200K tokens", + "cost": "High quality, excellent for code analysis", + "provider": "Anthropic" + }, + "Claude 3 Opus": { + "id": "anthropic/claude-3-opus", + "context": "200K tokens", + "cost": "Premium, best reasoning", + "provider": "Anthropic" + }, + "Claude 3 Haiku": { + "id": "anthropic/claude-3-haiku", + "context": "200K tokens", + "cost": "Fast and economical", + "provider": "Anthropic" + }, + "Claude 3.5 Haiku": { + "id": "anthropic/claude-3-5-haiku", + "context": "200K tokens", + "cost": "Fast, latest Haiku model", + "provider": "Anthropic" + }, + + # OpenAI Models + "GPT-4o": { + "id": "openai/gpt-4o", + "context": "128K tokens", + "cost": "Latest GPT-4, excellent performance", + "provider": "OpenAI" + }, + "GPT-4o Mini": { + "id": "openai/gpt-4o-mini", + "context": "128K tokens", + "cost": "Fast and cost-effective GPT-4", + "provider": "OpenAI" + }, + "GPT-4 Turbo": { + "id": "openai/gpt-4-turbo", + "context": "128K tokens", + "cost": "High quality, good for complex analysis", + "provider": "OpenAI" + }, + "GPT-4": { + "id": "openai/gpt-4", + "context": "8K tokens", + "cost": "Premium quality, shorter context", + "provider": "OpenAI" + }, + "GPT-3.5 Turbo": { + "id": "openai/gpt-3.5-turbo", + "context": "16K tokens", + "cost": "Economical, good for basic analysis", + "provider": "OpenAI" + }, + + # Google Models + "Gemini Pro 1.5": { + "id": "google/gemini-pro-1.5", + "context": "2M tokens", + "cost": "Latest Gemini, massive context", + "provider": "Google" + }, + "Gemini Pro": { + "id": "google/gemini-pro", + "context": "128K tokens", + "cost": "Good balance of quality and cost", + "provider": "Google" + }, + "Gemini Flash": { + "id": "google/gemini-flash-1.5", + "context": "1M tokens", + "cost": "Fast Gemini with large context", + "provider": "Google" + }, + "Gemini 2.0 Flash": { + "id": "google/gemini-2.0-flash-exp", + "context": "1M tokens", + "cost": "Experimental, very large context", + "provider": "Google" + }, + + # Meta Models + "Llama 3.1 70B": { + "id": "meta-llama/llama-3.1-70b-instruct", + "context": "128K tokens", + "cost": "Open source, good performance", + "provider": "Meta" + }, + "Llama 3.1 8B": { + "id": "meta-llama/llama-3.1-8b-instruct", + "context": "128K tokens", + "cost": "Fast and lightweight", + "provider": "Meta" + }, + "Llama 3.1 405B": { + "id": "meta-llama/llama-3.1-405b-instruct", + "context": "128K tokens", + "cost": "Largest open model, premium performance", + "provider": "Meta" + }, + + # Mistral Models + "Mistral 7B": { + "id": "mistralai/mistral-7b-instruct", + "context": "32K tokens", + "cost": "Fast and capable", + "provider": "Mistral" + }, + "Mixtral 8x7B": { + "id": "mistralai/mixtral-8x7b-instruct", + "context": "32K tokens", + "cost": "Mixture of experts, high quality", + "provider": "Mistral" + }, + "Codestral": { + "id": "mistralai/codestral-mamba", + "context": "256K tokens", + "cost": "Code-focused model", + "provider": "Mistral" + }, + + # Specialized Models + "DeepSeek Coder": { + "id": "deepseek/deepseek-coder", + "context": "16K tokens", + "cost": "Specialized for code analysis", + "provider": "DeepSeek" + }, + "DeepSeek V2.5": { + "id": "deepseek/deepseek-chat", + "context": "32K tokens", + "cost": "Advanced reasoning capabilities", + "provider": "DeepSeek" + }, + + # Other Models + "Qwen 2.5 72B": { + "id": "qwen/qwen-2.5-72b-instruct", + "context": "32K tokens", + "cost": "High-performance open model", + "provider": "Qwen" + }, + "Gemma 7B": { + "id": "google/gemma-7b-it", + "context": "8K tokens", + "cost": "Google's lightweight model", + "provider": "Google" + } +} + +class OpenRouterCallback(BaseCallbackHandler): + """Custom callback for tracking OpenRouter usage""" + def __init__(self): + self.model_calls = [] + self.total_tokens = 0 + self.total_cost = 0.0 + self.current_model = None + + def on_llm_start(self, serialized: Dict[str, Any], prompts: List[str], **kwargs): + self.model_calls.append({ + 'timestamp': datetime.now(), + 'model': serialized.get('model_name', 'unknown'), + 'prompt_length': sum(len(p) for p in prompts) + }) + self.current_model = serialized.get('model_name', 'unknown') + + def on_llm_end(self, response, **kwargs): + if hasattr(response, 'llm_output') and response.llm_output: + usage = response.llm_output.get('token_usage', {}) + tokens = usage.get('total_tokens', 0) + self.total_tokens += tokens + + # Estimate cost (rough estimates) + cost_estimates = { + 'gpt-4': 0.03 * tokens / 1000, + 'gpt-3.5-turbo': 0.002 * tokens / 1000, + 'claude-3': 0.015 * tokens / 1000, + 'gemini': 0.001 * tokens / 1000 + } + + model_family = self.current_model.split('/')[0] if '/' in self.current_model else self.current_model + estimated_cost = cost_estimates.get(model_family, 0.01 * tokens / 1000) + self.total_cost += estimated_cost + +class OpenRouterLangChainReviewer: + """LangChain-based code reviewer using OpenRouter API""" + + def __init__(self): + self.llm = None + self.current_model = None + self.api_key = None + self.text_splitter = RecursiveCharacterTextSplitter( + chunk_size=4000, + chunk_overlap=200, + separators=["\n\n", "\n", "class ", "def ", "function ", "//", "#", "```"] + ) + self.memory = ConversationBufferMemory( + memory_key="chat_history", + return_messages=True + ) + self.callback = OpenRouterCallback() + self._setup_parsers() + self._setup_prompts() + + def _setup_parsers(self): + """Initialize LangChain output parsers""" + self.json_parser = JsonOutputParser() + self.pydantic_parser = PydanticOutputParser(pydantic_object=AnalysisResult) + self.issue_parser = PydanticOutputParser(pydantic_object=CodeIssue) + self.str_parser = StrOutputParser() + + def _setup_prompts(self): + """Setup LangChain prompt templates""" + + # System message for all analyses + self.system_message = SystemMessage(content=""" + You are an expert senior software engineer and security auditor with 15+ years of experience. + You specialize in code review, security analysis, and performance optimization across multiple languages. + + Your analysis should be: + - Thorough but practical and actionable + - Security-focused when vulnerabilities are present + - Performance-aware for optimization opportunities + - Maintainability-oriented for long-term code health + + Always provide specific, actionable suggestions with concrete examples when possible. + Focus on high-impact issues that improve code quality, security, and performance. + """) + + # Analysis prompts are now created dynamically in each method to avoid template issues + + def setup_model(self, model_name: str, api_key: str, temperature: float = 0.1) -> bool: + """Setup OpenRouter model with LangChain""" + try: + self.api_key = api_key + model_id = OPENROUTER_MODELS[model_name]["id"] + + # Initialize Langsmith tracing before creating LLM + langsmith_client = get_langsmith_client() + if langsmith_client: + logger.info("✅ Langsmith tracing active") + else: + logger.warning("⚠️ Langsmith tracing not available") + + # Create ChatOpenAI instance configured for OpenRouter + self.llm = ChatOpenAI( + model=model_id, + temperature=temperature, + openai_api_key=api_key, + openai_api_base="https://openrouter.ai/api/v1", + max_tokens=4000, + model_kwargs={ + "extra_headers": { + "HTTP-Referer": "https://streamlit-langchain-code-review.com", + "X-Title": "LangChain Code Review Agent" + } + }, + callbacks=[self.callback] + ) + + # Test the model + test_chain = self.llm | self.str_parser + test_response = test_chain.invoke("Respond with 'Model ready' if you can analyze code.") + + if len(test_response) > 5: + self.current_model = model_name + logger.info(f"Successfully configured {model_name} with Langsmith tracing") + return True + return False + + except Exception as e: + logger.error(f"Failed to setup {model_name}: {e}") + return False + + def get_model_info(self, model_name: str) -> Dict[str, str]: + """Get information about a specific model""" + return OPENROUTER_MODELS.get(model_name, {}) + + def analyze_code_comprehensive(self, code: str, language: str) -> AnalysisResult: + """Comprehensive code analysis using LangChain chains""" + if not self.llm: + raise ValueError("No model configured") + + # Ensure Langsmith is initialized + langsmith_client = get_langsmith_client() + + start_time = datetime.now() + + try: + # Check if code needs chunking + if len(code) > 10000: + return self._analyze_large_code(code, language) + + # Run analysis with direct LLM call to avoid template issues + try: + # Debug: Log what we're sending to the model + logger.info(f"Sending to model - Language: {language}, Code length: {len(code)} chars") + logger.info(f"Code preview: {code[:200]}...") + + # Create the analysis prompt dynamically to ensure proper variable substitution + analysis_prompt_text = f""" + You are a code security auditor. Analyze this {language} code VERY CAREFULLY for ANY issues. + + CODE TO ANALYZE: + ```{language} + {code} + ``` + + You MUST return ONLY a valid JSON array. Find issues in this code! + + REQUIRED JSON FORMAT: + [ + {{ + "severity": "Critical", + "category": "Security", + "line_number": 1, + "title": "Specific security vulnerability", + "description": "Detailed explanation of the security risk and impact", + "suggestion": "Concrete steps to fix the vulnerability", + "confidence": 0.95 + }} + ] + + If no issues found, return: [] + + CRITICAL: Look for these specific issues: + - Hardcoded passwords/API keys (security vulnerability) + - Debug mode enabled in production (security risk) + - CORS allowing all origins (*) (security vulnerability) + - No authentication on sensitive endpoints (security vulnerability) + - Logging sensitive data (security vulnerability) + - SQL injection vulnerabilities + - Command injection risks + - Insecure default configurations + + BE SPECIFIC: Reference actual line numbers and quote problematic code. + NEVER return empty array unless code is truly perfect. + Your response must be ONLY the JSON array, nothing else. + """ + + # Use the LLM directly with the constructed prompt + messages = [ + self.system_message, + HumanMessage(content=analysis_prompt_text) + ] + + raw_result = self.llm.invoke(messages) + + # Extract the content from the response + if hasattr(raw_result, 'content'): + raw_result = raw_result.content + elif isinstance(raw_result, str): + pass # already a string + else: + raw_result = str(raw_result) + + # Enhanced JSON parsing with multiple fallback strategies + logger.info(f"Raw model response (first 500 chars): {raw_result[:500]}") + result = self._parse_analysis_response(raw_result, code) + logger.info(f"Parsed result: {result}") + + except Exception as e: + logger.warning(f"Chain execution failed: {e}") + result = [] + + # Parse issues with error handling + issues = [] + if isinstance(result, list): + for issue_data in result: + try: + # Add code snippet if line number is valid + if isinstance(issue_data, dict): + line_num = issue_data.get('line_number', 0) + if line_num > 0: + code_lines = code.split('\n') + if line_num <= len(code_lines): + issue_data['code_snippet'] = code_lines[line_num - 1].strip() + + issue = CodeIssue(**issue_data) + issues.append(issue) + except Exception as e: + logger.warning(f"Failed to parse issue: {e}") + continue + elif isinstance(result, str): + # Handle case where result is still a string + issues = self._parse_text_to_issues(result, code) + + # If no issues found and we have code, try to detect obvious issues + if not issues and code.strip(): + logger.warning("No issues found by AI, checking for obvious security issues") + issues = self._detect_obvious_issues(code) + + # Generate summary using another chain + summary = self._generate_summary(issues, code, language) + + # Calculate quality score + quality_score = self._calculate_quality_score(issues, len(code.split('\n'))) + + # Generate recommendations + recommendations = self._generate_recommendations(issues) + + analysis_time = (datetime.now() - start_time).total_seconds() + + return AnalysisResult( + issues=issues, + summary=summary, + quality_score=quality_score, + model_used=f"{self.current_model} (via OpenRouter)", + analysis_time=analysis_time, + recommendations=recommendations, + token_usage={ + "total_tokens": 0, # Langsmith tracks this automatically + "estimated_cost": 0.0 # Langsmith tracks this automatically + } + ) + + except Exception as e: + logger.error(f"Comprehensive analysis failed: {e}") + raise + + def analyze_security_focused(self, code: str, language: str) -> List[CodeIssue]: + """Security-focused analysis using specialized chain""" + if not self.llm: + raise ValueError("No model configured") + + # Ensure Langsmith is initialized + langsmith_client = get_langsmith_client() + + try: + # Create the security analysis prompt dynamically + security_prompt_text = f""" + You are a cybersecurity expert. Perform DEEP security analysis on this {language} code. Return ONLY valid JSON array. + + CODE TO ANALYZE: + ```{language} + {code} + ``` + + You MUST return ONLY a valid JSON array. Find security vulnerabilities! + + CRITICAL SECURITY CHECKS: + - **Injection Attacks**: SQL injection, command injection, code injection + - **Authentication**: Weak passwords, missing auth, broken authentication + - **Authorization**: Privilege escalation, access control bypass + - **Input Validation**: XSS, CSRF, path traversal, buffer overflow + - **Cryptography**: Weak encryption, exposed secrets, insecure random + - **Data Exposure**: Information leakage, sensitive data logging + - **Configuration**: Debug mode, insecure defaults, exposed internals + - **Network Security**: CORS misconfiguration, host binding issues + + REQUIRED JSON FORMAT: + [ + {{ + "severity": "Critical", + "category": "Security", + "line_number": 1, + "title": "Specific security vulnerability", + "description": "Detailed explanation of the security risk and impact", + "suggestion": "Concrete steps to fix the vulnerability", + "confidence": 0.95 + }} + ] + + BE SPECIFIC: Include exact line numbers and quote problematic code. + PRIORITIZE: Focus on high-impact security vulnerabilities. + NEVER return empty array unless code has NO security issues at all. + Your response must be ONLY the JSON array, nothing else. + """ + + # Use the LLM directly with the constructed prompt + messages = [ + self.system_message, + HumanMessage(content=security_prompt_text) + ] + + raw_result = self.llm.invoke(messages) + + # Extract the content from the response + if hasattr(raw_result, 'content'): + raw_result = raw_result.content + elif isinstance(raw_result, str): + pass # already a string + else: + raw_result = str(raw_result) + + # Parse JSON from response + try: + import json + result = json.loads(raw_result) + except json.JSONDecodeError: + json_match = re.search(r'\[.*\]', raw_result, re.DOTALL) + if json_match: + result = json.loads(json_match.group(0)) + else: + result = self._parse_text_to_issues(raw_result, code) + + issues = [] + if isinstance(result, list): + for issue_data in result: + try: + if isinstance(issue_data, dict): + line_num = issue_data.get('line_number', 0) + if line_num > 0: + code_lines = code.split('\n') + if line_num <= len(code_lines): + issue_data['code_snippet'] = code_lines[line_num - 1].strip() + + issue = CodeIssue(**issue_data) + if issue.category == IssueCategory.SECURITY: + issues.append(issue) + except Exception as e: + logger.warning(f"Failed to parse security issue: {e}") + + # If no security issues found by AI, check for obvious security issues + if not issues and code.strip(): + logger.warning("No security issues found by AI, checking for obvious security issues") + all_obvious = self._detect_obvious_issues(code) + # Filter only security issues + security_obvious = [i for i in all_obvious if i.category == IssueCategory.SECURITY] + issues.extend(security_obvious) + logger.info(f"Added {len(security_obvious)} obvious security issues") + + return issues + + except Exception as e: + logger.error(f"Security analysis failed: {e}") + return [] + + def analyze_performance_focused(self, code: str, language: str) -> List[CodeIssue]: + """Performance-focused analysis using specialized chain""" + if not self.llm: + raise ValueError("No model configured") + + # Ensure Langsmith is initialized + langsmith_client = get_langsmith_client() + + try: + # Create the performance analysis prompt dynamically + performance_prompt_text = f""" + You are a performance optimization expert. Analyze performance bottlenecks in this {language} code. Return ONLY valid JSON array. + + CODE TO ANALYZE: + ```{language} + {code} + ``` + + You MUST return ONLY a valid JSON array. Find performance issues! + + PERFORMANCE ANALYSIS FOCUS: + - **Algorithm Complexity**: O(n²) vs O(n log n), inefficient loops, recursive issues + - **Memory Management**: Memory leaks, excessive allocations, large object retention + - **I/O Operations**: File I/O bottlenecks, network calls, database queries + - **CPU Usage**: Heavy computations, blocking operations, thread contention + - **Resource Management**: Connection pooling, caching opportunities, lazy loading + - **Scalability Issues**: Hard-coded limits, synchronous operations, single-threaded bottlenecks + - **Data Structures**: Inefficient data structures, unnecessary copying, redundant operations + + REQUIRED JSON FORMAT: + [ + {{ + "severity": "High", + "category": "Performance", + "line_number": 1, + "title": "Specific performance bottleneck", + "description": "Detailed explanation of performance impact and root cause", + "suggestion": "Concrete optimization steps with expected performance improvement", + "confidence": 0.85 + }} + ] + + QUANTIFY IMPACT: Estimate performance improvement (e.g., "50% faster", "reduces memory by 60%"). + BE SPECIFIC: Include algorithmic complexity analysis and measurable improvements. + PRIORITIZE: Focus on high-impact performance optimizations. + NEVER return empty array unless code has NO performance issues at all. + Your response must be ONLY the JSON array, nothing else. + """ + + # Use the LLM directly with the constructed prompt + messages = [ + self.system_message, + HumanMessage(content=performance_prompt_text) + ] + + raw_result = self.llm.invoke(messages) + + # Extract the content from the response + if hasattr(raw_result, 'content'): + raw_result = raw_result.content + elif isinstance(raw_result, str): + pass # already a string + else: + raw_result = str(raw_result) + + # Parse JSON from response + try: + import json + result = json.loads(raw_result) + except json.JSONDecodeError: + json_match = re.search(r'\[.*\]', raw_result, re.DOTALL) + if json_match: + result = json.loads(json_match.group(0)) + else: + result = self._parse_text_to_issues(raw_result, code) + + issues = [] + if isinstance(result, list): + for issue_data in result: + try: + if isinstance(issue_data, dict): + line_num = issue_data.get('line_number', 0) + if line_num > 0: + code_lines = code.split('\n') + if line_num <= len(code_lines): + issue_data['code_snippet'] = code_lines[line_num - 1].strip() + + issue = CodeIssue(**issue_data) + if issue.category == IssueCategory.PERFORMANCE: + issues.append(issue) + except Exception as e: + logger.warning(f"Failed to parse performance issue: {e}") + + # If no performance issues found by AI, check for obvious performance issues + if not issues and code.strip(): + logger.warning("No performance issues found by AI, checking for obvious performance issues") + all_obvious = self._detect_obvious_issues(code) + # Filter only performance issues + perf_obvious = [i for i in all_obvious if i.category == IssueCategory.PERFORMANCE] + issues.extend(perf_obvious) + logger.info(f"Added {len(perf_obvious)} obvious performance issues") + + return issues + + except Exception as e: + logger.error(f"Performance analysis failed: {e}") + return [] + + def _analyze_large_code(self, code: str, language: str) -> AnalysisResult: + """Handle large code files using LangChain text splitter""" + # Ensure Langsmith is initialized + langsmith_client = get_langsmith_client() + + start_time = datetime.now() + + # Split code into manageable chunks + documents = [Document(page_content=code)] + chunks = self.text_splitter.split_documents(documents) + + st.info(f"📄 Large codebase detected! Processing {len(chunks)} chunks with {self.current_model}") + + all_issues = [] + progress_bar = st.progress(0) + + # Process each chunk + for i, chunk in enumerate(chunks): + try: + # Create the analysis prompt dynamically for this chunk + chunk_prompt_text = f""" + You are a code security auditor. Analyze this {language} code chunk VERY CAREFULLY for ANY issues. + + CODE CHUNK TO ANALYZE: + ```{language} + {chunk.page_content} + ``` + + You MUST return ONLY a valid JSON array. Find issues in this code chunk! + + REQUIRED JSON FORMAT: + [ + {{ + "severity": "Critical", + "category": "Security", + "line_number": 1, + "title": "Specific security vulnerability", + "description": "Detailed explanation of the security risk and impact", + "suggestion": "Concrete steps to fix the vulnerability", + "confidence": 0.95 + }} + ] + + If no issues found in this chunk, return: [] + + BE SPECIFIC: Reference actual line numbers and quote problematic code. + NEVER return empty array unless chunk has NO issues at all. + Your response must be ONLY the JSON array, nothing else. + """ + + # Use the LLM directly with the constructed prompt + messages = [ + self.system_message, + HumanMessage(content=chunk_prompt_text) + ] + + raw_result = self.llm.invoke(messages) + + # Extract the content from the response + if hasattr(raw_result, 'content'): + raw_result = raw_result.content + elif isinstance(raw_result, str): + pass # already a string + else: + raw_result = str(raw_result) + + # Parse JSON from response + try: + import json + result = json.loads(raw_result) + except json.JSONDecodeError: + json_match = re.search(r'\[.*\]', raw_result, re.DOTALL) + if json_match: + result = json.loads(json_match.group(0)) + else: + result = self._parse_text_to_issues(raw_result, chunk.page_content) + + if isinstance(result, list): + for issue_data in result: + try: + if isinstance(issue_data, dict): + line_num = issue_data.get('line_number', 0) + if line_num > 0: + chunk_lines = chunk.page_content.split('\n') + if line_num <= len(chunk_lines): + issue_data['code_snippet'] = chunk_lines[line_num - 1].strip() + + issue = CodeIssue(**issue_data) + all_issues.append(issue) + except Exception as e: + logger.warning(f"Failed to parse issue in chunk {i+1}: {e}") + + progress_bar.progress((i + 1) / len(chunks)) + + except Exception as e: + logger.error(f"Chunk {i+1} analysis failed: {e}") + continue + + progress_bar.empty() + + # Generate comprehensive summary + summary = self._generate_summary(all_issues, code, language) + quality_score = self._calculate_quality_score(all_issues, len(code.split('\n'))) + recommendations = self._generate_recommendations(all_issues) + + analysis_time = (datetime.now() - start_time).total_seconds() + + return AnalysisResult( + issues=all_issues, + summary=summary, + quality_score=quality_score, + model_used=f"{self.current_model} (via OpenRouter)", + analysis_time=analysis_time, + recommendations=recommendations, + token_usage={ + "total_tokens": 0, # Langsmith tracks this automatically + "estimated_cost": 0.0 # Langsmith tracks this automatically + } + ) + + def _generate_summary(self, issues: List[CodeIssue], code: str, language: str) -> str: + """Generate analysis summary using LangChain chain""" + try: + # Generate dynamic summary based on actual issues + if not issues: + return self._generate_no_issues_summary(language, len(code.split('\n'))) + + # Create detailed issues summary + issues_summary = self._create_issues_summary(issues) + + # Generate dynamic summary using LLM if available + if self.llm: + try: + # Create the summary prompt dynamically + quality_score = self._calculate_quality_score(issues, len(code.split('\n'))) + summary_prompt_text = f""" + Generate a comprehensive executive summary based on this code analysis. + + CODE ANALYSIS DATA: + - Programming Language: {language} + - Lines of Code: {len(code.split('\n'))} + - Total Issues Found: {len(issues)} + - AI Model Used: {self.current_model} + - Quality Score: {quality_score}/100 + + ISSUES SUMMARY: + {issues_summary} + + Write a professional executive summary that includes: + + 1. **Overall Assessment**: Evaluate the code quality based on the issues found + 2. **Critical Issues**: Highlight any immediate security or stability concerns + 3. **Priority Actions**: Recommend the top 3 most important fixes needed + 4. **Quality Score Explanation**: Explain why the code received this quality score + 5. **Improvement Strategy**: Suggest a roadmap for enhancing code quality + + IMPORTANT: Use the actual values provided above. Do NOT use placeholder text like {{language}} or {{total_issues}}. Replace them with the real values. + + Format your response as a clean, professional summary without any code blocks or markdown artifacts. + """ + + # Use the LLM directly with the constructed prompt + messages = [ + self.system_message, + HumanMessage(content=summary_prompt_text) + ] + + summary_result = self.llm.invoke(messages) + + # Extract the content from the response + if hasattr(summary_result, 'content'): + summary = summary_result.content + elif isinstance(summary_result, str): + summary = summary_result + else: + summary = str(summary_result) + + # Clean any remaining placeholders from LLM response + cleaned_summary = self._clean_summary_placeholders( + summary, language, len(code.split('\n')), len(issues), self.current_model + ) + return cleaned_summary + except Exception as e: + logger.warning(f"LLM summary generation failed: {e}") + return self._generate_fallback_summary(issues, language, len(code.split('\n'))) + + # Fallback summary generation + return self._generate_fallback_summary(issues, language, len(code.split('\n'))) + + except Exception as e: + logger.error(f"Summary generation failed: {e}") + return self._generate_error_summary(issues, language, len(code.split('\n'))) + + def _generate_no_issues_summary(self, language: str, lines_of_code: int) -> str: + """Generate summary when no issues are found""" + return f"""## Executive Summary + +**Analysis Results:** Comprehensive code review completed successfully. No significant issues were identified in the {language} codebase. + +**Code Statistics:** +- Language: {language} +- Lines of code: {lines_of_code:,} +- Total issues found: 0 +- Model used: {self.current_model} + +**Overall Assessment:** The codebase demonstrates excellent coding practices with strong attention to security, performance, and maintainability. The code structure is clean and well-organized. + +**Critical Issues:** None identified - no immediate security or stability concerns. + +**Priority Actions:** +1. Continue maintaining current coding standards +2. Regular code reviews to maintain quality +3. Keep dependencies updated + +**Quality Score Justification:** Score of 95/100 reflects the high quality of the codebase with no significant issues found and adherence to best practices. + +**Improvement Roadmap:** Continue with current development practices and consider implementing automated testing if not already in place.""" + + def _generate_fallback_summary(self, issues: List[CodeIssue], language: str, lines_of_code: int) -> str: + """Generate fallback summary without LLM""" + severity_counts = {} + category_counts = {} + + for issue in issues: + severity_counts[issue.severity.value] = severity_counts.get(issue.severity.value, 0) + 1 + category_counts[issue.category.value] = category_counts.get(issue.category.value, 0) + 1 + + critical_issues = severity_counts.get('Critical', 0) + high_issues = severity_counts.get('High', 0) + quality_score = self._calculate_quality_score(issues, lines_of_code) + + if critical_issues > 0: + assessment = f"The {language} codebase requires immediate attention with {critical_issues} critical issues that may impact security and stability." + elif high_issues > 0: + assessment = f"The {language} codebase has {high_issues} high-priority issues that should be addressed in the next development cycle." + else: + assessment = f"The {language} codebase shows good quality with only minor issues that don't require immediate attention." + + # Generate priority actions based on issues + priority_actions = [] + if critical_issues > 0: + priority_actions.append("Address all critical security and stability issues immediately") + if high_issues > 0: + priority_actions.append("Fix high-priority issues in the next development sprint") + priority_actions.append("Plan maintenance for medium and low-priority improvements") + + return f"""**Analysis Results:** Code review completed for {language} codebase ({lines_of_code:,} lines) identified {len(issues)} issues requiring attention across security, performance, and maintainability aspects. + +**Overall Assessment:** {assessment} + +**Critical Issues:** {critical_issues} critical issues found that require immediate attention. +**High Priority:** {high_issues} high-priority issues identified. + +**Priority Actions:** +{"\n".join(f"{i+1}. {action}" for i, action in enumerate(priority_actions))} + +**Quality Score Justification:** The codebase received a quality score of {quality_score}/100 based on {len(issues)} issues found across {lines_of_code:,} lines of code, with {critical_issues} critical and {high_issues} high-priority issues affecting the overall assessment. + +**Improvement Roadmap:** Focus on resolving critical and high-priority issues first, followed by systematic improvement of code quality and implementation of best practices.""" + + def _generate_error_summary(self, issues: List[CodeIssue], language: str, lines_of_code: int) -> str: + """Generate summary when there's an error""" + quality_score = self._calculate_quality_score(issues, lines_of_code) + return f"""**Analysis Results:** Code review completed for {language} codebase ({lines_of_code:,} lines) with some technical difficulties. Found {len(issues)} issues in the analysis. + +**Overall Assessment:** Analysis completed successfully despite technical challenges. Please review the detailed findings below. + +**Critical Issues:** {len([i for i in issues if i.severity == Severity.CRITICAL])} critical issues identified. +**High Priority:** {len([i for i in issues if i.severity == Severity.HIGH])} high-priority issues found. + +**Quality Score:** The codebase received a quality score of {quality_score}/100 based on available analysis results. + +**Recommendations:** Review all identified issues and implement fixes as needed. + +**Note:** Some advanced analysis features may have been limited due to technical constraints.""" + + def _create_issues_summary(self, issues: List[CodeIssue]) -> str: + """Create a formatted summary of issues""" + if not issues: + return "No issues found" + + # Group issues by severity and category + severity_groups = {} + category_groups = {} + + for issue in issues[:15]: # Limit for summary + severity = issue.severity.value + category = issue.category.value + + if severity not in severity_groups: + severity_groups[severity] = [] + if category not in category_groups: + category_groups[category] = [] + + severity_groups[severity].append(issue) + category_groups[category].append(issue) + + summary_lines = [] + + # Add critical issues first + if 'Critical' in severity_groups: + summary_lines.append("**Critical Issues:**") + for issue in severity_groups['Critical']: + summary_lines.append(f"- Line {issue.line_number}: {issue.title}") + + # Add high priority issues + if 'High' in severity_groups: + summary_lines.append("\n**High Priority Issues:**") + for issue in severity_groups['High']: + summary_lines.append(f"- Line {issue.line_number}: {issue.title}") + + # Add category breakdown + summary_lines.append(f"\n**Issues by Category:** {', '.join(f'{cat}: {len(category_groups[cat])}' for cat in category_groups)}") + + return "\n".join(summary_lines) + + def _calculate_quality_score(self, issues: List[CodeIssue], lines_of_code: int) -> float: + """Calculate code quality score based on issues found""" + if not issues: + return 95.0 + + # Enhanced severity-based penalties with more realistic scoring + severity_weights = { + Severity.CRITICAL: 30, # Higher penalty for critical issues + Severity.HIGH: 20, # Higher penalty for high issues + Severity.MEDIUM: 10, # Moderate penalty for medium issues + Severity.LOW: 5 # Lower penalty for low issues + } + + # Category-based additional penalties (security issues are more severe) + category_multipliers = { + IssueCategory.SECURITY: 1.5, # Security issues are 50% more severe + IssueCategory.PERFORMANCE: 1.2, # Performance issues are 20% more severe + IssueCategory.BUG: 1.3, # Bugs are 30% more severe + IssueCategory.STYLE: 1.0, # Style issues have normal weight + IssueCategory.MAINTAINABILITY: 1.1 # Maintainability issues are slightly more severe + } + + total_penalty = 0 + for issue in issues: + base_weight = severity_weights.get(issue.severity, 10) + category_multiplier = category_multipliers.get(issue.category, 1.0) + total_penalty += base_weight * category_multiplier + + # Adjust for code size - normalize by lines of code + # This prevents large codebases from getting unfairly low scores + size_factor = min(1.0, 1000 / max(lines_of_code, 100)) # Cap at 1000 lines for normalization + normalized_penalty = total_penalty * size_factor + + # Calculate final score with minimum bounds + base_score = 100 + final_score = max(10, base_score - normalized_penalty) # Minimum score of 10 + + return round(final_score, 1) + + def _parse_text_to_issues(self, text: str, code: str) -> List[CodeIssue]: + """Parse text response into CodeIssue objects when JSON parsing fails""" + issues = [] + + # If no response or very short response, return empty list + if not text or len(text.strip()) < 20: + return issues + + # Try to extract JSON from the response if it's wrapped in text + json_patterns = [ + r'```json\s*(\[.*?\])\s*```', # JSON in code blocks + r'```\s*(\[.*?\])\s*```', # JSON in code blocks without json tag + r'(\[.*\])', # Just the JSON array + ] + + for pattern in json_patterns: + matches = re.findall(pattern, text, re.DOTALL) + if matches: + for match in matches: + try: + result = json.loads(match) + if isinstance(result, list): + for issue_data in result: + if isinstance(issue_data, dict): + try: + # Add code snippet if line number is valid + line_num = issue_data.get('line_number', 0) + if line_num > 0: + code_lines = code.split('\n') + if line_num <= len(code_lines): + issue_data['code_snippet'] = code_lines[line_num - 1].strip() + + issue = CodeIssue(**issue_data) + issues.append(issue) + except Exception as e: + logger.warning(f"Failed to parse issue: {e}") + continue + except json.JSONDecodeError: + continue + + # If no JSON found, try to parse as structured text + if not issues: + issues = self._parse_structured_text(text, code) + + return issues + + def _parse_structured_text(self, text: str, code: str) -> List[CodeIssue]: + """Parse structured text response into CodeIssue objects""" + issues = [] + code_lines = code.split('\n') + + # Split by common issue separators + issue_blocks = re.split(r'\n\s*(?=\d+\.|\*\s*|\-\s*[A-Z])', text) + + for block in issue_blocks: + block = block.strip() + if not block or len(block) < 10: + continue + + # Try to extract issue information + issue_info = self._extract_issue_info(block, code_lines) + if issue_info: + try: + issues.append(CodeIssue(**issue_info)) + except Exception as e: + logger.warning(f"Failed to create issue from text: {e}") + continue + + return issues + + def _extract_issue_info(self, text: str, code_lines: list) -> Optional[dict]: + """Extract issue information from text block""" + # Determine severity + severity = Severity.MEDIUM + if any(word in text.upper() for word in ['CRITICAL', 'SEVERE', 'URGENT', 'DANGER']): + severity = Severity.CRITICAL + elif any(word in text.upper() for word in ['HIGH', 'IMPORTANT']): + severity = Severity.HIGH + elif any(word in text.upper() for word in ['LOW', 'MINOR', 'NIT']): + severity = Severity.LOW + + # Determine category + category = IssueCategory.MAINTAINABILITY + if any(word in text.upper() for word in ['SECURITY', 'VULNERABLE', 'ATTACK', 'INJECTION', 'XSS', 'CSRF']): + category = IssueCategory.SECURITY + elif any(word in text.upper() for word in ['PERFORMANCE', 'SLOW', 'OPTIMIZE', 'MEMORY', 'SPEED']): + category = IssueCategory.PERFORMANCE + elif any(word in text.upper() for word in ['BUG', 'ERROR', 'CRASH', 'FAIL', 'NULL', 'EXCEPTION']): + category = IssueCategory.BUG + elif any(word in text.upper() for word in ['STYLE', 'FORMAT', 'PEP', 'NAMING', 'CONVENTION']): + category = IssueCategory.STYLE + + # Extract line number + line_num = 0 + line_matches = re.findall(r'line\s*(\d+)', text, re.IGNORECASE) + if line_matches: + line_num = int(line_matches[0]) + + # Extract title and description + title = text[:60] + "..." if len(text) > 60 else text + description = text + + # Extract suggestion if present + suggestion = "Review and fix this issue" + if "suggestion:" in text.lower() or "fix:" in text.lower() or "recommend:" in text.lower(): + parts = re.split(r'suggestion:|fix:|recommend:', text, flags=re.IGNORECASE) + if len(parts) > 1: + suggestion = parts[1].strip()[:200] + + # Add code snippet if line number is valid + code_snippet = "" + if line_num > 0 and line_num <= len(code_lines): + code_snippet = code_lines[line_num - 1].strip() + + return { + 'severity': severity, + 'category': category, + 'line_number': line_num, + 'title': title, + 'description': description, + 'suggestion': suggestion, + 'code_snippet': code_snippet, + 'confidence': 0.8 + } + + def _parse_analysis_response(self, raw_result: str, code: str) -> List[dict]: + """Enhanced parsing of analysis response with multiple fallback strategies""" + # Clean the raw result first + cleaned_result = raw_result.strip() + logger.info(f"Parsing response: '{cleaned_result[:200]}...'") + + # Strategy 1: Try direct JSON parsing + try: + result = json.loads(cleaned_result) + if isinstance(result, list): + logger.info(f"Strategy 1 success: Found {len(result)} issues") + return result + except json.JSONDecodeError as e: + logger.info(f"Strategy 1 failed: {e}") + + # Strategy 2: Extract JSON from code blocks + json_patterns = [ + r'```json\s*(\[.*?\])\s*```', # JSON in code blocks + r'```\s*(\[.*?\])\s*```', # JSON in code blocks without json tag + r'```(\[.*?\])```', # JSON in code blocks (alternative) + ] + + for pattern in json_patterns: + matches = re.findall(pattern, cleaned_result, re.DOTALL) + logger.info(f"Strategy 2 pattern '{pattern}' found {len(matches)} matches") + for match in matches: + try: + result = json.loads(match) + if isinstance(result, list): + logger.info(f"Strategy 2 success: Found {len(result)} issues") + return result + except json.JSONDecodeError as e: + logger.info(f"Strategy 2 JSON decode failed: {e}") + continue + + # Strategy 3: Extract any JSON array from the text + json_array_patterns = [ + r'(\[[\s\S]*?\])', # Any JSON array (non-greedy) + ] + + for pattern in json_array_patterns: + matches = re.findall(pattern, cleaned_result) + logger.info(f"Strategy 3 pattern found {len(matches)} matches") + for match in matches: + try: + result = json.loads(match) + if isinstance(result, list): + logger.info(f"Strategy 3 success: Found {len(result)} issues") + return result + except json.JSONDecodeError as e: + logger.info(f"Strategy 3 JSON decode failed: {e}") + continue + + # Strategy 4: Try to find structured content and parse as text + logger.warning("All JSON parsing strategies failed, attempting text-based parsing") + text_result = self._parse_text_to_issues(cleaned_result, code) + logger.info(f"Text parsing result: {len(text_result)} issues") + return text_result + + def _create_issue_from_dict(self, issue_dict: dict, code_lines: list) -> Optional[CodeIssue]: + """Create CodeIssue from dictionary with validation""" + try: + # Add code snippet if line number is valid + line_num = issue_dict.get('line_number', 0) + if line_num > 0 and line_num <= len(code_lines): + issue_dict['code_snippet'] = code_lines[line_num - 1].strip() + else: + issue_dict['code_snippet'] = "" + + return CodeIssue(**issue_dict) + except Exception as e: + logger.warning(f"Failed to create issue: {e}") + return None + + def _generate_recommendations(self, issues: List[CodeIssue]) -> List[str]: + """Generate prioritized recommendations based on issues""" + recommendations = [] + + if not issues: + return ["✅ **EXCELLENT**: Code quality is high, continue following current practices", + "🔍 **MAINTENANCE**: Consider implementing automated testing and code review processes", + "📚 **BEST PRACTICES**: Keep dependencies updated and follow security guidelines"] + + # Categorize issues + critical_issues = [i for i in issues if i.severity == Severity.CRITICAL] + high_issues = [i for i in issues if i.severity == Severity.HIGH] + medium_issues = [i for i in issues if i.severity == Severity.MEDIUM] + low_issues = [i for i in issues if i.severity == Severity.LOW] + + security_issues = [i for i in issues if i.category == IssueCategory.SECURITY] + performance_issues = [i for i in issues if i.category == IssueCategory.PERFORMANCE] + bug_issues = [i for i in issues if i.category == IssueCategory.BUG] + style_issues = [i for i in issues if i.category == IssueCategory.STYLE] + maintainability_issues = [i for i in issues if i.category == IssueCategory.MAINTAINABILITY] + + # Generate contextual recommendations with specific priorities + if critical_issues: + recommendations.append(f"🚨 **CRITICAL URGENCY**: Address {len(critical_issues)} critical issues immediately - these pose significant security/stability risks") + if security_issues: + recommendations.append(f"🔒 **SECURITY FIRST**: Prioritize {len(security_issues)} security vulnerabilities - deploy security patches ASAP") + if bug_issues: + recommendations.append(f"🐛 **BUG FIXES**: Resolve {len(bug_issues)} bugs that may cause system crashes or incorrect behavior") + + if high_issues: + recommendations.append(f"⚠️ **HIGH PRIORITY**: Fix {len(high_issues)} high-severity issues in the next development sprint") + if performance_issues: + recommendations.append(f"⚡ **PERFORMANCE**: Optimize {len(performance_issues)} performance bottlenecks affecting user experience") + + if medium_issues: + recommendations.append(f"📋 **MEDIUM TERM**: Plan to address {len(medium_issues)} medium-priority issues within 2-3 sprints") + + if low_issues: + recommendations.append(f"🔧 **MAINTENANCE**: Schedule {len(low_issues)} low-priority improvements for future releases") + + # Add category-specific recommendations + if maintainability_issues: + recommendations.append(f"🏗️ **CODE ARCHITECTURE**: Refactor {len(maintainability_issues)} maintainability issues to improve long-term code health") + + if style_issues: + recommendations.append(f"💅 **CODE STYLE**: Apply {len(style_issues)} style improvements to ensure consistent coding standards") + + # Add general recommendations based on issue density + if len(issues) > 50: + recommendations.append("🏛️ **ARCHITECTURAL REVIEW**: High issue count suggests considering code restructuring or architectural improvements") + elif len(issues) > 20: + recommendations.append("🔍 **CODE REVIEW PROCESS**: Consider implementing peer code reviews to maintain quality standards") + else: + recommendations.append("✅ **QUALITY MAINTENANCE**: Continue current development practices while addressing identified issues") + + # Add specific actionable advice + if security_issues: + recommendations.append("🛡️ **SECURITY TESTING**: Implement automated security scanning in CI/CD pipeline") + + if performance_issues: + recommendations.append("📊 **PERFORMANCE MONITORING**: Set up performance monitoring and establish performance benchmarks") + + if bug_issues: + recommendations.append("🧪 **TESTING STRATEGY**: Enhance unit and integration test coverage to catch bugs early") + + return recommendations[:8] # Limit to top 8 recommendations + + def _detect_obvious_issues(self, code: str) -> List[CodeIssue]: + """Detect obvious security and code quality issues that should always be found""" + issues = [] + lines = code.split('\n') + + for i, line in enumerate(lines, 1): + line_clean = line.strip() + + # Check for hardcoded API keys/secrets + if any(pattern in line_clean.upper() for pattern in ['API_KEY =', 'SECRET =', 'PASSWORD =', 'TOKEN =']): + # Look for quotes indicating hardcoded values + if ('"' in line_clean or "'" in line_clean) and not line_clean.upper().endswith('= NONE'): + issues.append(CodeIssue( + severity=Severity.CRITICAL, + category=IssueCategory.SECURITY, + line_number=i, + title="Hardcoded Secret Detected", + description="API key, password, or secret appears to be hardcoded in the source code. This is a major security vulnerability.", + suggestion="Move secrets to environment variables or a secure configuration management system.", + code_snippet=line_clean, + confidence=0.95 + )) + + # Check for debug mode in production + if 'DEBUG=TRUE' in line_clean.upper() or 'DEBUG = TRUE' in line_clean.upper(): + issues.append(CodeIssue( + severity=Severity.HIGH, + category=IssueCategory.SECURITY, + line_number=i, + title="Debug Mode Enabled in Production", + description="Debug mode is enabled, which can expose sensitive information and reduce performance in production.", + suggestion="Set debug=False for production deployments and use proper logging instead.", + code_snippet=line_clean, + confidence=0.9 + )) + + # Check for CORS allowing all origins + if 'ALLOW_ORIGINS' in line_clean.upper() and ('["*"]' in line_clean or '["*"]' in line_clean): + issues.append(CodeIssue( + severity=Severity.CRITICAL, + category=IssueCategory.SECURITY, + line_number=i, + title="CORS Allows All Origins", + description="CORS is configured to allow all origins (*), which is a security vulnerability.", + suggestion="Specify allowed origins explicitly instead of using wildcard (*).", + code_snippet=line_clean, + confidence=0.95 + )) + + # Check for no authentication on sensitive endpoints + if ('@app.' in line_clean or '@router.' in line_clean) and 'admin' in line_clean.lower(): + # Check next few lines for auth + auth_found = False + for j in range(min(5, len(lines) - i)): + next_line = lines[i + j].strip() + if any(auth in next_line.upper() for auth in ['AUTH', 'JWT', 'TOKEN', 'LOGIN', 'PASSWORD']): + auth_found = True + break + + if not auth_found: + issues.append(CodeIssue( + severity=Severity.CRITICAL, + category=IssueCategory.SECURITY, + line_number=i, + title="Admin Endpoint Without Authentication", + description="Admin endpoint detected without visible authentication checks.", + suggestion="Add proper authentication and authorization to admin endpoints.", + code_snippet=line_clean, + confidence=0.9 + )) + + # Check for logging sensitive data + if 'print(' in line_clean and any(sensitive in line_clean.lower() for sensitive in ['password', 'token', 'key', 'secret']): + issues.append(CodeIssue( + severity=Severity.HIGH, + category=IssueCategory.SECURITY, + line_number=i, + title="Logging Sensitive Data", + description="Code appears to be logging or printing sensitive information like passwords or tokens.", + suggestion="Remove logging of sensitive data. Use proper logging with data masking if needed.", + code_snippet=line_clean, + confidence=0.85 + )) + + # Check for host 0.0.0.0 (security risk) + if 'host="0.0.0.0"' in line_clean or "host='0.0.0.0'" in line_clean: + issues.append(CodeIssue( + severity=Severity.MEDIUM, + category=IssueCategory.SECURITY, + line_number=i, + title="Server Bound to All Interfaces", + description="Server is bound to 0.0.0.0, exposing it to all network interfaces.", + suggestion="Bind to specific interfaces (127.0.0.1 for local development, specific IP for production).", + code_snippet=line_clean, + confidence=0.8 + )) + + logger.info(f"Detected {len(issues)} obvious issues") + return issues + + def _clean_summary_placeholders(self, summary: str, language: str, loc: int, total_issues: int, model_name: str) -> str: + """Clean any remaining placeholders in the summary text""" + # Replace any remaining placeholders that the LLM might have left + replacements = { + '{language}': language, + '{loc}': str(loc), + '{total_issues}': str(total_issues), + '{model_name}': model_name, + '{{language}}': language, + '{{loc}}': str(loc), + '{{total_issues}}': str(total_issues), + '{{model_name}}': model_name, + '{score}': str(self._calculate_quality_score([], loc)) # Default score if not calculated + } + + cleaned_summary = summary + for placeholder, value in replacements.items(): + cleaned_summary = cleaned_summary.replace(placeholder, value) + + return cleaned_summary + +def main(): + st.set_page_config( + page_title="LangChain + OpenRouter Code Review", + page_icon="🔗", + layout="wide" + ) + + st.title("🔗 LangChain Multi-Model Code Review") + st.caption("**Powered by OpenRouter API** - Access 20+ AI models through LangChain") + + # Model showcase info + col_info1, col_info2, col_info3 = st.columns(3) + with col_info1: + st.info("🤖 **12+ Models** - Claude, GPT-4, Gemini, Llama") + with col_info2: + st.info("🔗 **LangChain Powered** - Structured chains & parsing") + with col_info3: + st.info("💰 **Cost Tracking** - Monitor usage across models") + + # Initialize session state + if 'reviewer' not in st.session_state: + st.session_state.reviewer = OpenRouterLangChainReviewer() + if 'analysis_results' not in st.session_state: + st.session_state.analysis_results = None + + reviewer = st.session_state.reviewer + + # Sidebar configuration + with st.sidebar: + st.header("🔑 OpenRouter Configuration") + + # API Key input + api_key = st.text_input( + "OpenRouter API Key", + type="password", + help="Get your API key from https://openrouter.ai/keys" + ) + + if api_key: + st.success("✅ API Key configured") + else: + st.warning("⚠️ Enter OpenRouter API key to continue") + + st.divider() + + # Model selection with detailed info + st.header("🤖 Model Selection") + + # Group models by provider + providers = {} + for model_name, info in OPENROUTER_MODELS.items(): + provider = info["provider"] + if provider not in providers: + providers[provider] = [] + providers[provider].append(model_name) + + # Provider selection + selected_provider = st.selectbox( + "AI Provider", + list(providers.keys()), + help="Choose your preferred AI provider" + ) + + # Model selection within provider + available_models = providers[selected_provider] + selected_model = st.selectbox( + "Model", + available_models, + help="Select specific model variant" + ) + + # Show model details + if selected_model: + model_info = reviewer.get_model_info(selected_model) + st.info(f"**Context:** {model_info.get('context', 'Unknown')}") + st.info(f"**Notes:** {model_info.get('cost', 'Standard pricing')}") + + # Model setup + if api_key and selected_model: + if st.button("🚀 Initialize Model"): + with st.spinner(f"Setting up {selected_model}..."): + success = reviewer.setup_model( + model_name=selected_model, + api_key=api_key, + temperature=0.1 + ) + + if success: + st.success(f"✅ {selected_model} ready!") + st.session_state.model_ready = True + else: + st.error("❌ Model setup failed") + st.session_state.model_ready = False + + # Show active model + if reviewer.current_model: + st.success(f"🤖 **Active:** {reviewer.current_model}") + + # Usage statistics + if reviewer.callback.model_calls: + st.metric("API Calls", len(reviewer.callback.model_calls)) + st.metric("Total Tokens", f"{reviewer.callback.total_tokens:,}") + if reviewer.callback.total_cost > 0: + st.metric("Est. Cost", f"${reviewer.callback.total_cost:.4f}") + + st.divider() + + # Analysis configuration + st.header("📊 Analysis Settings") + + language = st.selectbox( + "Programming Language", + ["Python", "JavaScript", "TypeScript", "Java", "C++", "Go", "Rust", + "PHP", "C#", "Swift", "Kotlin", "Ruby", "Scala", "SQL"], + help="Select the primary language of your code" + ) + + analysis_mode = st.selectbox( + "Analysis Mode", + ["🔍 Comprehensive", "🔒 Security Focused", "⚡ Performance Focused"], + help="Choose analysis depth and focus area" + ) + + # Advanced options + with st.expander("🔧 Advanced Options"): + temperature = st.slider( + "Model Temperature", + 0.0, 1.0, 0.1, 0.1, + help="Lower = more focused, Higher = more creative" + ) + + confidence_threshold = st.slider( + "Confidence Threshold", + 0.0, 1.0, 0.6, 0.1, + help="Filter out low-confidence issues" + ) + + max_issues_display = st.selectbox( + "Max Issues to Display", + [10, 25, 50, 100, "All"], + index=2 + ) + + chunk_size = st.slider( + "Chunk Size (for large files)", + 2000, 8000, 4000, 500, + help="Smaller chunks = more detailed analysis" + ) + + # Main interface + col1, col2 = st.columns([1, 1]) + + with col1: + st.header("📝 Code Input") + + # Input method tabs + tab1, tab2, tab3 = st.tabs(["📝 Text Editor", "📁 File Upload", "📂 Multiple Files"]) + + code_content = "" + file_info = {} + + with tab1: + code_content = st.text_area( + "Enter your code:", + height=400, + placeholder=f"""// Paste your {language} code here +// LangChain + OpenRouter will analyze it with advanced AI models + +def example_function(): + # Your code here + pass""", + help="Paste code directly for immediate analysis" + ) + + with tab2: + uploaded_file = st.file_uploader( + "Upload single code file", + type=['py', 'js', 'ts', 'java', 'cpp', 'go', 'rs', 'php', 'cs', 'rb', 'scala', 'kt', 'swift', 'txt'], + help="Upload a code file for analysis" + ) + + if uploaded_file: + code_content = str(uploaded_file.read(), "utf-8") + lines = len(code_content.split('\n')) + chars = len(code_content) + + file_info = { + 'name': uploaded_file.name, + 'lines': lines, + 'size': chars, + 'estimated_tokens': chars // 4 + } + + st.success(f"📁 **{uploaded_file.name}** loaded successfully!") + + col_f1, col_f2, col_f3 = st.columns(3) + with col_f1: + st.metric("Lines", f"{lines:,}") + with col_f2: + st.metric("Characters", f"{chars:,}") + with col_f3: + st.metric("Est. Tokens", f"{chars//4:,}") + + with st.expander("📄 File Preview"): + preview_length = min(2000, len(code_content)) + st.code( + code_content[:preview_length] + ("..." if len(code_content) > preview_length else ""), + language=language.lower() + ) + + with tab3: + uploaded_files = st.file_uploader( + "Upload multiple code files", + type=['py', 'js', 'ts', 'java', 'cpp', 'go', 'rs', 'php', 'cs', 'rb', 'scala', 'kt', 'swift', 'txt'], + accept_multiple_files=True, + help="Upload multiple files to analyze as a combined codebase" + ) + + if uploaded_files: + combined_code = [] + total_lines = 0 + total_chars = 0 + + for file in uploaded_files: + file_content = str(file.read(), "utf-8") + file_lines = len(file_content.split('\n')) + + combined_code.append(f""" +# ===== FILE: {file.name} ===== +# Lines: {file_lines} +{file_content} +""") + total_lines += file_lines + total_chars += len(file_content) + + code_content = "\n".join(combined_code) + + file_info = { + 'files': len(uploaded_files), + 'total_lines': total_lines, + 'total_chars': total_chars, + 'estimated_tokens': total_chars // 4 + } + + st.success(f"📂 **{len(uploaded_files)} files** combined successfully!") + + col_mf1, col_mf2, col_mf3 = st.columns(3) + with col_mf1: + st.metric("Files", len(uploaded_files)) + with col_mf2: + st.metric("Total Lines", f"{total_lines:,}") + with col_mf3: + st.metric("Est. Tokens", f"{total_chars//4:,}") + + with st.expander("📋 Files Included"): + for file in uploaded_files: + st.write(f"• {file.name}") + + # Analysis execution + can_analyze = (code_content and + reviewer.current_model and + api_key) + + # Dynamic button text + if not api_key: + button_text = "🔑 Enter OpenRouter API Key First" + elif not reviewer.current_model: + button_text = "🤖 Initialize Model First" + elif not code_content: + button_text = "📝 Add Code to Analyze" + else: + estimated_tokens = len(code_content) // 4 + if estimated_tokens > 50000: + button_text = f"🚀 Analyze Large Codebase ({estimated_tokens:,} tokens)" + else: + button_text = f"🚀 Start {analysis_mode.split()[1]} Analysis" + + if st.button(button_text, type="primary", disabled=not can_analyze): + with st.spinner(f"🔍 Running {analysis_mode} with {reviewer.current_model}..."): + try: + # Update model temperature if changed + if hasattr(reviewer.llm, 'temperature'): + reviewer.llm.temperature = temperature + + # Run appropriate analysis + if analysis_mode == "🔍 Comprehensive": + result = reviewer.analyze_code_comprehensive(code_content, language) + + elif analysis_mode == "🔒 Security Focused": + issues = reviewer.analyze_security_focused(code_content, language) + + # Create result object for security analysis + result = AnalysisResult( + issues=issues, + summary=f"Security analysis completed with {reviewer.current_model}. Found {len(issues)} potential security vulnerabilities requiring attention.", + quality_score=max(50, 100 - len([i for i in issues if i.severity == Severity.CRITICAL]) * 15 - len([i for i in issues if i.severity == Severity.HIGH]) * 8), + model_used=f"{reviewer.current_model} (Security Focus)", + analysis_time=1.0, + recommendations=[f"🔒 Review and fix {len(issues)} security issues"], + token_usage={ + "total_tokens": reviewer.callback.total_tokens, + "estimated_cost": round(reviewer.callback.total_cost, 4) + } + ) + + else: # Performance Focused + issues = reviewer.analyze_performance_focused(code_content, language) + + result = AnalysisResult( + issues=issues, + summary=f"Performance analysis completed with {reviewer.current_model}. Identified {len(issues)} optimization opportunities to improve application performance.", + quality_score=max(60, 100 - len([i for i in issues if i.severity == Severity.HIGH]) * 10 - len([i for i in issues if i.severity == Severity.MEDIUM]) * 5), + model_used=f"{reviewer.current_model} (Performance Focus)", + analysis_time=1.0, + recommendations=[f"⚡ Optimize {len(issues)} performance bottlenecks"], + token_usage={ + "total_tokens": reviewer.callback.total_tokens, + "estimated_cost": round(reviewer.callback.total_cost, 4) + } + ) + + # Apply confidence filtering + if confidence_threshold > 0: + original_count = len(result.issues) + result.issues = [i for i in result.issues if i.confidence >= confidence_threshold] + filtered_count = len(result.issues) + + if filtered_count < original_count: + st.info(f"🎯 Filtered {original_count - filtered_count} low-confidence issues (< {confidence_threshold})") + + # Limit display results + if max_issues_display != "All" and len(result.issues) > int(max_issues_display): + result.issues = result.issues[:int(max_issues_display)] + st.info(f"📊 Showing top {max_issues_display} issues (use sidebar to show more)") + + st.session_state.analysis_results = result + st.session_state.original_code = code_content + st.session_state.file_info = file_info + + # Success message with metrics + success_msg = f"✅ **Analysis Complete!** Found {len(result.issues)} issues" + if result.token_usage.get('total_tokens'): + success_msg += f" • Used {result.token_usage['total_tokens']:,} tokens" + if result.token_usage.get('estimated_cost'): + success_msg += f" • Est. cost: ${result.token_usage['estimated_cost']:.4f}" + + st.success(success_msg) + + except Exception as e: + st.error(f"❌ Analysis failed: {str(e)}") + st.info("💡 Try a different model or check your API key") + + with col2: + st.header("📊 Analysis Results") + + if st.session_state.analysis_results: + result = st.session_state.analysis_results + + # Quality score with color coding + quality_score = result.quality_score + if quality_score >= 85: + score_color = "🟢" + elif quality_score >= 70: + score_color = "🟡" + elif quality_score >= 50: + score_color = "🟠" + else: + score_color = "🔴" + + # Display metrics in large, vertical format + col_metric1, col_metric2 = st.columns([1, 1]) + + with col_metric1: + # Quality Score - BIG + st.markdown(f"

Quality Score

", unsafe_allow_html=True) + st.markdown(f"

{score_color} {quality_score:.1f}/100

", unsafe_allow_html=True) + + # Critical Issues - BIG + critical_count = len([i for i in result.issues if i.severity == Severity.CRITICAL]) + st.markdown("

Critical Issues

", unsafe_allow_html=True) + st.markdown(f"

{critical_count}

", unsafe_allow_html=True) + + with col_metric2: + # High Priority - BIG + high_count = len([i for i in result.issues if i.severity == Severity.HIGH]) + st.markdown("

High Priority

", unsafe_allow_html=True) + st.markdown(f"

{high_count}

", unsafe_allow_html=True) + + # Total Issues - BIG + st.markdown("

Total Issues

", unsafe_allow_html=True) + st.markdown(f"

{len(result.issues)}

", unsafe_allow_html=True) + + st.markdown("---") + + # Model and time info + col_info1, col_info2 = st.columns(2) + with col_info1: + st.markdown(f"🤖 **Model:** {result.model_used}") + with col_info2: + st.markdown(f"⏱️ **Time:** {result.analysis_time:.1f}s") + + # Token usage info + if result.token_usage: + col_usage1, col_usage2 = st.columns(2) + with col_usage1: + if result.token_usage.get('total_tokens'): + st.info(f"🔢 **Tokens:** {result.token_usage['total_tokens']:,}") + with col_usage2: + if result.token_usage.get('estimated_cost'): + st.info(f"💰 **Est. Cost:** ${result.token_usage['estimated_cost']:.4f}") + + # Executive summary + st.markdown("### 📋 Executive Summary") + st.markdown(result.summary) + + # Key recommendations + if result.recommendations: + st.markdown("### 💡 Priority Recommendations") + for i, rec in enumerate(result.recommendations): + if i < 5: # Limit to top 5 recommendations + st.markdown(rec) + + # Issues visualization + if result.issues: + st.subheader("📊 Issues Breakdown") + + # Create severity and category charts + col_chart1, col_chart2 = st.columns(2) + + with col_chart1: + severity_counts = {} + for issue in result.issues: + severity = issue.severity.value + severity_counts[severity] = severity_counts.get(severity, 0) + 1 + + if severity_counts: + st.bar_chart( + severity_counts, + use_container_width=True, + height=200 + ) + st.caption("Issues by Severity") + + with col_chart2: + category_counts = {} + for issue in result.issues: + category = issue.category.value + category_counts[category] = category_counts.get(category, 0) + 1 + + if category_counts: + st.bar_chart( + category_counts, + use_container_width=True, + height=200 + ) + st.caption("Issues by Category") + + else: + st.info("👆 Configure OpenRouter, select a model, and analyze code to see results") + + # Feature showcase + with st.expander("🌟 LangChain + OpenRouter Features"): + st.markdown(""" + **🔗 LangChain Integration:** + - Structured prompt templates with ChatPromptTemplate + - Type-safe parsing with Pydantic models + - Chain composition using LCEL (LangChain Expression Language) + - Automatic text splitting for large codebases + - Memory and conversation tracking + - Custom callbacks for usage monitoring + + **🤖 Multi-Model Support via OpenRouter:** + - **Anthropic:** Claude 3.5 Sonnet, Opus, Haiku + - **OpenAI:** GPT-4 Turbo, GPT-4, GPT-3.5 Turbo + - **Google:** Gemini Pro, Gemini 2.0 Flash + - **Meta:** Llama 3.1 70B, 405B + - **Specialized:** DeepSeek Coder, Codestral + + **💰 Cost & Usage Tracking:** + - Real-time token usage monitoring + - Cost estimation across different models + - API call tracking and performance metrics + """) + + # Detailed issues section + if st.session_state.analysis_results and st.session_state.analysis_results.issues: + st.header("🔍 Detailed Issues Analysis") + + issues = st.session_state.analysis_results.issues + + # Filtering options + col_filter1, col_filter2, col_filter3 = st.columns(3) + + with col_filter1: + severity_filter = st.multiselect( + "Filter by Severity", + [s.value for s in Severity], + default=[s.value for s in Severity], + key="severity_filter" + ) + + with col_filter2: + category_filter = st.multiselect( + "Filter by Category", + [c.value for c in IssueCategory], + default=[c.value for c in IssueCategory], + key="category_filter" + ) + + with col_filter3: + sort_by = st.selectbox( + "Sort by", + ["Severity", "Confidence", "Line Number", "Category"], + key="sort_by" + ) + + # Apply filters + filtered_issues = [ + issue for issue in issues + if (issue.severity.value in severity_filter and + issue.category.value in category_filter) + ] + + # Sort issues + if sort_by == "Severity": + severity_order = {Severity.CRITICAL: 0, Severity.HIGH: 1, Severity.MEDIUM: 2, Severity.LOW: 3} + filtered_issues.sort(key=lambda x: severity_order.get(x.severity, 4)) + elif sort_by == "Confidence": + filtered_issues.sort(key=lambda x: x.confidence, reverse=True) + elif sort_by == "Line Number": + filtered_issues.sort(key=lambda x: x.line_number) + else: # Category + filtered_issues.sort(key=lambda x: x.category.value) + + st.write(f"**Showing {len(filtered_issues)} of {len(issues)} issues**") + + # Display issues + for i, issue in enumerate(filtered_issues): + severity_emoji = { + Severity.CRITICAL: "🔴", + Severity.HIGH: "🟠", + Severity.MEDIUM: "🟡", + Severity.LOW: "🔵" + }[issue.severity] + + # Create expandable issue card + with st.expander( + f"{severity_emoji} **{issue.title}** | Line {issue.line_number} | {issue.category.value} | Confidence: {issue.confidence:.1f}", + expanded=(i < 3 and issue.severity in [Severity.CRITICAL, Severity.HIGH]) + ): + col_issue1, col_issue2 = st.columns([3, 1]) + + with col_issue1: + st.markdown("**📝 Description:**") + st.write(issue.description) + + st.markdown("**💡 Suggested Fix:**") + st.write(issue.suggestion) + + if issue.code_snippet: + st.markdown("**📄 Code Snippet:**") + st.code(issue.code_snippet, language=language.lower()) + + with col_issue2: + st.markdown("**📊 Issue Details:**") + st.write(f"**Severity:** {issue.severity.value}") + st.write(f"**Category:** {issue.category.value}") + st.write(f"**Line:** {issue.line_number}") + st.write(f"**Confidence:** {issue.confidence:.1f}") + + # Priority indicator + if issue.severity == Severity.CRITICAL: + st.error("🚨 **CRITICAL** - Fix immediately") + elif issue.severity == Severity.HIGH: + st.warning("⚠️ **HIGH** - Address soon") + elif issue.severity == Severity.MEDIUM: + st.info("📋 **MEDIUM** - Plan to fix") + else: + st.success("✓ **LOW** - Optional improvement") + + # Export and sharing section + if st.session_state.analysis_results: + st.header("📤 Export & Share Results") + + col_export1, col_export2, col_export3, col_export4 = st.columns(4) + + with col_export1: + # JSON export + if st.button("📋 Export JSON"): + export_data = { + "analysis_result": st.session_state.analysis_results.dict(), + "model_info": { + "model_used": reviewer.current_model, + "provider": "OpenRouter", + "analysis_time": st.session_state.analysis_results.analysis_time + }, + "code_info": st.session_state.get('file_info', {}), + "langchain_info": { + "framework": "LangChain", + "parsers_used": ["JsonOutputParser", "PydanticOutputParser"], + "chains_used": ["analysis_chain", "summary_chain"] + }, + "timestamp": datetime.now().isoformat() + } + + st.download_button( + "📥 Download Full Report", + json.dumps(export_data, indent=2, default=str), + file_name=f"langchain_openrouter_analysis_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json", + mime="application/json", + help="Complete analysis results with metadata" + ) + + with col_export2: + # Summary export + if st.button("📝 Export Summary"): + summary_text = f"""# Code Review Summary +Generated by: {st.session_state.analysis_results.model_used} +Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} +Framework: LangChain + OpenRouter + +## Quality Score +{st.session_state.analysis_results.quality_score}/100 + +## Issues Found +- Total: {len(st.session_state.analysis_results.issues)} +- Critical: {len([i for i in st.session_state.analysis_results.issues if i.severity == Severity.CRITICAL])} +- High: {len([i for i in st.session_state.analysis_results.issues if i.severity == Severity.HIGH])} +- Medium: {len([i for i in st.session_state.analysis_results.issues if i.severity == Severity.MEDIUM])} +- Low: {len([i for i in st.session_state.analysis_results.issues if i.severity == Severity.LOW])} + +## Executive Summary +{st.session_state.analysis_results.summary} + +## Key Recommendations +{chr(10).join(f"- {rec}" for rec in st.session_state.analysis_results.recommendations)} + +## Usage Statistics +- Analysis Time: {st.session_state.analysis_results.analysis_time:.1f}s +- Tokens Used: {st.session_state.analysis_results.token_usage.get('total_tokens', 'N/A')} +- Estimated Cost: ${st.session_state.analysis_results.token_usage.get('estimated_cost', 0):.4f} +""" + + st.download_button( + "📥 Download Summary", + summary_text, + file_name=f"code_review_summary_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md", + mime="text/markdown" + ) + + with col_export3: + # Usage stats + if st.button("📊 Usage Stats"): + st.json({ + "model_calls": len(reviewer.callback.model_calls), + "total_tokens": reviewer.callback.total_tokens, + "estimated_cost": round(reviewer.callback.total_cost, 4), + "current_model": reviewer.current_model, + "analysis_time": st.session_state.analysis_results.analysis_time, + "issues_found": len(st.session_state.analysis_results.issues) + }) + + with col_export4: + # Share link (placeholder) + if st.button("🔗 Share Results"): + st.info("🚧 Share functionality coming soon!") + st.write("For now, use the export options to share your analysis results.") + +# Advanced features demonstration +def show_advanced_langchain_patterns(): + """Demonstrate advanced LangChain patterns""" + st.header("🚀 Advanced LangChain Patterns") + + with st.expander("🔗 Chain Composition Examples"): + st.code(""" +# LangChain Expression Language (LCEL) examples + +# Basic chain composition +analysis_chain = prompt | llm | json_parser + +# Parallel processing multiple aspects +parallel_analysis = RunnableParallel({ + "security": security_prompt | llm | json_parser, + "performance": performance_prompt | llm | json_parser, + "maintainability": maintainability_prompt | llm | json_parser +}) + +# Conditional routing based on code complexity +def route_by_complexity(input_data): + lines = len(input_data["code"].split('\n')) + if lines > 1000: + return detailed_analysis_chain + else: + return quick_analysis_chain + +routing_chain = RunnableLambda(route_by_complexity) + +# Sequential chain with memory +chain_with_context = ( + RunnablePassthrough.assign( + history=lambda x: memory.chat_memory.messages + ) + | contextualized_prompt + | llm + | json_parser +) + """, language="python") + + with st.expander("🎯 Structured Output with Pydantic"): + st.code(""" +# Type-safe output models +class SecurityVulnerability(BaseModel): + cve_id: Optional[str] = None + severity: Literal["Critical", "High", "Medium", "Low"] + vulnerability_type: str + affected_lines: List[int] + exploitability_score: float = Field(ge=0.0, le=10.0) + remediation_steps: List[str] + references: List[str] = Field(default_factory=list) + +class PerformanceIssue(BaseModel): + bottleneck_type: str + current_complexity: str # e.g., "O(n²)" + optimized_complexity: str # e.g., "O(n log n)" + performance_impact: Literal["High", "Medium", "Low"] + optimization_suggestion: str + code_example: str + +# Parser integration +security_parser = PydanticOutputParser(pydantic_object=SecurityVulnerability) +performance_parser = PydanticOutputParser(pydantic_object=PerformanceIssue) + +# Chain with structured output +security_chain = ( + security_prompt.partial( + format_instructions=security_parser.get_format_instructions() + ) + | llm + | security_parser +) + """, language="python") + + with st.expander("📊 Custom Callbacks and Monitoring"): + st.code(""" +class ComprehensiveCallback(BaseCallbackHandler): + def __init__(self): + self.metrics = { + "start_time": None, + "end_time": None, + "token_usage": {}, + "model_switches": [], + "error_count": 0, + "chain_executions": [] + } + + def on_chain_start(self, serialized, inputs, **kwargs): + self.metrics["start_time"] = datetime.now() + self.metrics["chain_executions"].append({ + "chain": serialized.get("id", ["unknown"])[-1], + "start_time": datetime.now(), + "inputs_size": len(str(inputs)) + }) + + def on_llm_start(self, serialized, prompts, **kwargs): + model_name = serialized.get("id", ["unknown"])[-1] + self.metrics["model_switches"].append({ + "model": model_name, + "timestamp": datetime.now(), + "prompt_tokens": sum(len(p) for p in prompts) + }) + + def on_llm_end(self, response, **kwargs): + if hasattr(response, 'llm_output'): + usage = response.llm_output.get('token_usage', {}) + for key, value in usage.items(): + if key in self.metrics["token_usage"]: + self.metrics["token_usage"][key] += value + else: + self.metrics["token_usage"][key] = value + + def on_chain_error(self, error, **kwargs): + self.metrics["error_count"] += 1 + logger.error(f"Chain error: {error}") + + def get_performance_report(self): + total_time = (self.metrics["end_time"] - self.metrics["start_time"]).total_seconds() + return { + "total_execution_time": total_time, + "chains_executed": len(self.metrics["chain_executions"]), + "models_used": len(set(m["model"] for m in self.metrics["model_switches"])), + "total_tokens": self.metrics["token_usage"].get("total_tokens", 0), + "errors_encountered": self.metrics["error_count"] + } + +# Usage +callback = ComprehensiveCallback() +chain = prompt | llm.with_config(callbacks=[callback]) | parser +result = chain.invoke({"code": code_content}) +performance_report = callback.get_performance_report() + """, language="python") + +if __name__ == "__main__": + main() + + # Advanced features toggle + with st.sidebar: + st.divider() + if st.checkbox("🚀 Show Advanced Patterns", help="Display advanced LangChain usage examples"): + show_advanced_langchain_patterns() \ No newline at end of file diff --git a/Week13/Day1/csv_1 (1).py b/Week13/Day1/csv_1 (1).py new file mode 100644 index 00000000..128677d6 --- /dev/null +++ b/Week13/Day1/csv_1 (1).py @@ -0,0 +1,581 @@ +# imports +import streamlit as st +import os, tempfile +import pandas as pd +from langchain_openai import ChatOpenAI +from langchain_community.vectorstores import FAISS +from langchain_huggingface import HuggingFaceEmbeddings +from langchain_text_splitters import RecursiveCharacterTextSplitter +from langchain_community.document_loaders import CSVLoader +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +from langchain_core.runnables.history import RunnableWithMessageHistory +from langchain_community.chat_message_histories import ChatMessageHistory +from langchain_core.chat_history import BaseChatMessageHistory +from langchain_experimental.agents import create_pandas_dataframe_agent +from langchain.chains.summarize import load_summarize_chain +from langchain_core.output_parsers import PydanticOutputParser, StrOutputParser +from pydantic import BaseModel, Field +from typing import List, Optional +import matplotlib.pyplot as plt +import asyncio +import json + +# Langsmith integration +import langsmith +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() + +# Enable Langsmith tracing (CORRECT format from documentation) +langsmith_key = os.getenv('LANGSMITH_API_KEY') +if langsmith_key: + langsmith_client = langsmith.Client(api_key=langsmith_key) + os.environ["LANGSMITH_TRACING"] = "true" + os.environ["LANGSMITH_API_KEY"] = langsmith_key + os.environ["LANGSMITH_PROJECT"] = "CSV App" + # Set for backward compatibility + os.environ["LANGCHAIN_TRACING_V2"] = "true" + os.environ["LANGCHAIN_PROJECT"] = "CSV App" + +# Pydantic models for structured responses (moved to module level) +class CSVResponse(BaseModel): + """Structured response for CSV queries""" + answer: str = Field(description="The main answer to the user's question") + confidence: float = Field(description="Confidence score from 0-1", ge=0.0, le=1.0) + reasoning: str = Field(description="Brief explanation of how the answer was derived") + data_used: List[str] = Field(description="Key data points used from the CSV", default_factory=list) + +class AnalysisResponse(BaseModel): + """Structured response for CSV analysis""" + summary: str = Field(description="Summary of the analysis") + insights: List[str] = Field(description="Key insights discovered", default_factory=list) + recommendations: List[str] = Field(description="Recommended actions", default_factory=list) + +class SummaryResponse(BaseModel): + """Structured response for CSV summarization""" + main_summary: str = Field(description="Main summary of the CSV content") + key_points: List[str] = Field(description="Most important points", default_factory=list) + data_quality: str = Field(description="Assessment of data quality") + +# MUST be the first Streamlit command +st.set_page_config(page_title="CSV AI", layout="wide") +os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" + +def home_page(): + st.write("""Select any one feature from above sliderbox: \n + 1. Chat with CSV \n + 2. Analyze CSV """) + +@st.cache_resource() +def get_embeddings_model(): + """Initialize and cache the embedding model""" + return HuggingFaceEmbeddings( + model_name="sentence-transformers/all-MiniLM-L6-v2", + model_kwargs={'device': 'cpu'}, + encode_kwargs={'normalize_embeddings': True} + ) + +# Remove caching from retriever_func to avoid API key issues +def retriever_func(uploaded_file): + if uploaded_file: + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + tmp_file.write(uploaded_file.getvalue()) + tmp_file_path = tmp_file.name + try: + loader = CSVLoader(file_path=tmp_file_path, encoding="utf-8") + data = loader.load() + except: + loader = CSVLoader(file_path=tmp_file_path, encoding="cp1252") + data = loader.load() + + text_splitter = RecursiveCharacterTextSplitter( + chunk_size=1000, + chunk_overlap=200, + add_start_index=True + ) + all_splits = text_splitter.split_documents(data) + + # Use free HuggingFace embeddings (no API key required) + embeddings = get_embeddings_model() + vectorstore = FAISS.from_documents(documents=all_splits, embedding=embeddings) + retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 6}) + + # Clean up temp file + os.remove(tmp_file_path) + return retriever, vectorstore + else: + st.info("Please upload CSV documents to continue.") + st.stop() + +def chat(temperature, model_name, user_api_key): + st.write("# Talk to CSV") + reset = st.sidebar.button("Reset Chat") + uploaded_file = st.sidebar.file_uploader("Upload your CSV here 👇:", type="csv") + + if not uploaded_file: + st.info("Please upload a CSV file to start chatting.") + return + + # Check if API key is valid + if not user_api_key or user_api_key == "": + st.error("❌ Please enter your OpenRouter API key in the sidebar to use this functionality.") + return + + try: + retriever, vectorstore = retriever_func(uploaded_file) + except Exception as e: + st.error(f"❌ Error processing CSV file: {str(e)}") + return + + # Configure LLM for OpenRouter with explicit API key + try: + # Reduce max_tokens to fit within credit limit + max_tokens = 1000 # Reduced from default to avoid credit issues + + llm = ChatOpenAI( + model=model_name, + temperature=temperature, + streaming=True, + max_tokens=max_tokens, + base_url="https://openrouter.ai/api/v1", + api_key=user_api_key, + default_headers={ + "HTTP-Referer": "https://localhost:8501", + "X-Title": "CSV AI App" + } + ) + if "grok" in model_name.lower(): + st.success(f"🤖 Connected to {model_name} (max_tokens: {max_tokens}) - FREE MODEL! 🎉") + else: + st.success(f"🤖 Connected to {model_name} (max_tokens: {max_tokens})") + except Exception as e: + error_msg = str(e) + if "402" in error_msg and "credits" in error_msg: + st.error("❌ **Insufficient Credits!**") + st.error("💳 You need more OpenRouter credits to use this model.") + st.error("🔗 Visit: https://openrouter.ai/settings/credits") + st.warning("💡 Try using a smaller model like 'mistralai/mistral-7b-instruct'") + else: + st.error(f"❌ Failed to connect to OpenRouter: {error_msg}") + return + + if "messages" not in st.session_state: + st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you?"}] + + store = {} + + # Enhanced prompt with structured response format + prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + """Use the following pieces of context to answer the question at the end. + If you don't know the answer, just say that you don't know, don't try to make up an answer. + + Context: {context} + + Please provide a structured response in the following JSON format: + {{ + "answer": "Your main answer here", + "confidence": 0.8, + "reasoning": "Brief explanation of how you arrived at the answer", + "data_used": ["key data points from context"] + }}""", + ), + MessagesPlaceholder(variable_name="history"), + ("human", "{input}"), + ] + ) + + # Use Pydantic parser for structured responses + parser = PydanticOutputParser(pydantic_object=CSVResponse) + runnable = prompt | llm | parser + + def get_session_history(session_id: str) -> BaseChatMessageHistory: + if session_id not in store: + store[session_id] = ChatMessageHistory() + return store[session_id] + + with_message_history = RunnableWithMessageHistory( + runnable, + get_session_history, + input_messages_key="input", + history_messages_key="history", + ) + + for msg in st.session_state.messages: + st.chat_message(msg["role"]).write(msg["content"]) + + # Handle chat input + if prompt := st.chat_input(): + st.session_state.messages.append({"role": "user", "content": prompt}) + st.chat_message("user").write(prompt) + + try: + # Get context from vectorstore + context_results = vectorstore.similarity_search(prompt, k=6) + context = "\n\n".join(doc.page_content for doc in context_results) + + with st.chat_message("assistant"): + message_placeholder = st.empty() + full_response = "" + + # Use streaming response + try: + # Get structured response from model + response = with_message_history.invoke( + {"context": context, "input": prompt}, + config={"configurable": {"session_id": "abc123"}} + ) + + if isinstance(response, CSVResponse): + # Format structured response nicely + full_response = f""" +**Answer:** {response.answer} + +**Confidence:** {response.confidence:.2f} + +**Reasoning:** {response.reasoning} +""" + if response.data_used: + full_response += f"\n**Data Used:**\n" + "\n".join(f"• {item}" for item in response.data_used) + elif hasattr(response, 'content'): + full_response = response.content + else: + full_response = str(response) + + # Display the response + message_placeholder.markdown(full_response) + + # Show raw JSON in expander for debugging + with st.expander("🔍 Raw Response (Debug)"): + if isinstance(response, CSVResponse): + st.json({ + "answer": response.answer, + "confidence": response.confidence, + "reasoning": response.reasoning, + "data_used": response.data_used + }) + else: + st.text(str(response)) + + except Exception as stream_error: + st.error(f"❌ Response parsing error: {stream_error}") + # Fallback to basic response + try: + response = with_message_history.invoke( + {"context": context, "input": prompt}, + config={"configurable": {"session_id": "abc123"}} + ) + full_response = response.content if hasattr(response, 'content') else str(response) + message_placeholder.markdown(f"**Basic Response:**\n\n{full_response}") + except Exception as fallback_error: + st.error(f"❌ Complete failure: {fallback_error}") + full_response = "Sorry, I encountered an error processing your request. Please try rephrasing your question." + + st.session_state.messages.append({"role": "assistant", "content": full_response}) + + except Exception as e: + st.error(f"❌ Error processing your question: {str(e)}") + st.session_state.messages.append({"role": "assistant", "content": "Sorry, I encountered an error processing your request."}) + + # Handle reset button + if reset: + st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you?"}] + st.rerun() + +def summary(model_name, temperature, top_p, user_api_key): + st.write("# Summary of CSV") + st.write("Upload your document here:") + uploaded_file = st.file_uploader("Upload source document", type="csv", label_visibility="collapsed") + + if not user_api_key or user_api_key == "": + st.error("❌ Please enter your OpenRouter API key in the sidebar to use this functionality.") + return + + if uploaded_file is not None: + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + tmp_file.write(uploaded_file.getvalue()) + tmp_file_path = tmp_file.name + + text_splitter = RecursiveCharacterTextSplitter(chunk_size = 1024, chunk_overlap=100) + try: + loader = CSVLoader(file_path=tmp_file_path, encoding="cp1252") + data = loader.load() + texts = text_splitter.split_documents(data) + except: + loader = CSVLoader(file_path=tmp_file_path, encoding="utf-8") + data = loader.load() + texts = text_splitter.split_documents(data) + + os.remove(tmp_file_path) + + st.info(f"📄 Loaded {len(texts)} text chunks from your CSV file") + + gen_sum = st.button("Generate Summary") + if gen_sum: + with st.spinner("Generating summary... This may take a moment."): + try: + # Reduce max_tokens to fit within credit limit + max_tokens = 1000 + + llm = ChatOpenAI( + model=model_name, + temperature=temperature, + max_tokens=max_tokens, + base_url="https://openrouter.ai/api/v1", + api_key=user_api_key, + default_headers={ + "HTTP-Referer": "https://localhost:8501", + "X-Title": "CSV AI App" + } + ) + st.success(f"🤖 Connected to {model_name} for summarization (max_tokens: {max_tokens})") + chain = load_summarize_chain( + llm=llm, + chain_type="map_reduce", + return_intermediate_steps=True, + input_key="input_documents", + output_key="output_text", + ) + result = chain({"input_documents": texts}, return_only_outputs=True) + st.success("✅ Summary generated successfully!") + st.markdown("### 📋 Summary:") + st.write(result["output_text"]) + except Exception as e: + st.error(f"❌ Error generating summary: {str(e)}") + st.info("💡 Try using a smaller CSV file or check your API key.") + +def analyze(temperature, model_name, user_api_key): + st.write("# Analyze CSV") + reset = st.sidebar.button("Reset Chat") + uploaded_file = st.sidebar.file_uploader("Upload your CSV here 👇:", type="csv") + + if not user_api_key or user_api_key == "": + st.error("❌ Please enter your OpenRouter API key in the sidebar to use this functionality.") + return + + if uploaded_file is not None: + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + tmp_file.write(uploaded_file.getvalue()) + tmp_file_path = tmp_file.name + + df = pd.read_csv(tmp_file_path) + os.remove(tmp_file_path) + + st.info(f"📊 CSV loaded: {df.shape[0]} rows × {df.shape[1]} columns") + + with st.expander("📋 Column Information"): + st.write("**Columns:**", list(df.columns)) + st.write("**Data Types:**") + st.write(df.dtypes) + + try: + # Reduce max_tokens to fit within credit limit + max_tokens = 1000 + + llm = ChatOpenAI( + model=model_name, + temperature=temperature, + max_tokens=max_tokens, + base_url="https://openrouter.ai/api/v1", + api_key=user_api_key, + default_headers={ + "HTTP-Referer": "https://localhost:8501", + "X-Title": "CSV AI App" + } + ) + st.success(f"🤖 Connected to {model_name} for analysis (max_tokens: {max_tokens})") + except Exception as e: + st.error(f"❌ Failed to connect to OpenRouter: {str(e)}") + return + + try: + agent = create_pandas_dataframe_agent( + llm, + df, + agent_type="openai-tools", + verbose=True, + allow_dangerous_code=True, + handle_parsing_errors=True, + prefix=""" +You are working with a pandas dataframe in Python. The name of the dataframe is `df`. +When creating visualizations: +1. Always use matplotlib.pyplot as plt +2. Always call plt.show() after creating plots +3. Use st.pyplot() to display plots in Streamlit +4. For better display, set figure size with plt.figure(figsize=(10, 6)) + +You should use the tools below to answer the question posed of you: +""" + ) + except Exception as e: + st.error(f"❌ Error creating agent: {str(e)}") + st.stop() + + if "messages" not in st.session_state: + st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you analyze your CSV data? I can create visualizations, calculate statistics, and answer questions about your data."}] + + for msg in st.session_state.messages: + st.chat_message(msg["role"]).write(msg["content"]) + + if prompt := st.chat_input(placeholder="Try: 'Create a histogram of column X' or 'Show correlation between columns'"): + st.session_state.messages.append({"role": "user", "content": prompt}) + st.chat_message("user").write(prompt) + + try: + with st.spinner("Analyzing..."): + import matplotlib.pyplot as plt + + enhanced_prompt = f""" +{prompt} + +Important instructions for visualizations: +- Import matplotlib.pyplot as plt if creating plots +- Set figure size: plt.figure(figsize=(10, 6)) +- After creating plots, use st.pyplot(plt.gcf()) to display in Streamlit +- Then call plt.close() to clear the figure +- Always show the plot using these Streamlit commands +""" + + msg = agent.invoke({"input": enhanced_prompt, "chat_history": st.session_state.messages}) + + if plt.get_fignums(): + st.pyplot(plt.gcf()) + plt.close() + + st.session_state.messages.append({"role": "assistant", "content": msg["output"]}) + st.chat_message("assistant").write(msg["output"]) + except Exception as e: + error_msg = f"❌ Error: {str(e)}" + st.session_state.messages.append({"role": "assistant", "content": error_msg}) + st.chat_message("assistant").write(error_msg) + + if reset: + st.session_state["messages"] = [] + + st.sidebar.markdown("---") + st.sidebar.warning( + "⚠️ **Security Notice**: This feature executes Python code to analyze your data. " + "Only use with trusted CSV files." + ) + + st.sidebar.markdown("---") + st.sidebar.success( + "💡 **Try these commands**:\n" + "- 'Show the first 5 rows'\n" + "- 'Create a histogram of [column]'\n" + "- 'Calculate correlation matrix'\n" + "- 'Plot [column1] vs [column2]'\n" + "- 'Show summary statistics'" + ) + +# Main App +def main(): + st.markdown( + """ +
+

🧠 CSV AI

+
+ """, + unsafe_allow_html=True, + ) + st.markdown( + """ +
+

⚡️ Interacting, Analyzing and Summarizing CSV Files!

+
+ """, + unsafe_allow_html=True, + ) + + # Check for OpenRouter API key + if os.path.exists(".env") and os.environ.get("OPENROUTER_API_KEY"): + user_api_key = os.environ["OPENROUTER_API_KEY"] + st.success("OpenRouter API key loaded from .env", icon="🚀") + else: + user_api_key = st.sidebar.text_input( + label="#### Enter OpenRouter API key 👇", + placeholder="Paste your OpenRouter API key, sk-or-v1-...", + type="password", + key="openrouter_api_key" + ) + if user_api_key: + st.sidebar.success("OpenRouter API key loaded", icon="🚀") + + # OpenRouter model options + MODEL_OPTIONS = [ + "x-ai/grok-4-fast:free", + "openai/gpt-4o", + "openai/gpt-4o-mini", + "openai/gpt-4-turbo", + "openai/gpt-3.5-turbo", + "anthropic/claude-3-5-sonnet-20241022", + "anthropic/claude-3-haiku-20240307", + "meta-llama/llama-3.1-70b-instruct", + "meta-llama/llama-3.1-8b-instruct", + "google/gemini-pro-1.5-latest", + "mistralai/mistral-7b-instruct" + ] + + TEMPERATURE_MIN_VALUE = 0.0 + TEMPERATURE_MAX_VALUE = 1.0 + TEMPERATURE_DEFAULT_VALUE = 0.9 + TEMPERATURE_STEP = 0.01 + + model_name = st.sidebar.selectbox( + label="Model", + options=MODEL_OPTIONS, + index=MODEL_OPTIONS.index("x-ai/grok-4-fast:free") # Set Grok as default + ) + top_p = st.sidebar.slider("Top_P", 0.0, 1.0, 1.0, 0.1) + temperature = st.sidebar.slider( + label="Temperature", + min_value=TEMPERATURE_MIN_VALUE, + max_value=TEMPERATURE_MAX_VALUE, + value=TEMPERATURE_DEFAULT_VALUE, + step=TEMPERATURE_STEP,) + + st.sidebar.markdown("---") + st.sidebar.info( + "💡 **Setup**:\n" + "- **OpenRouter API**: For chat models ([openrouter.ai](https://openrouter.ai))\n" + "- **Embeddings**: Free HuggingFace model (no API key needed!)\n\n" + "🚀 **Using**: `sentence-transformers/all-MiniLM-L6-v2`\n" + "🎯 **Free Model**: `x-ai/grok-4-fast:free` (default)" + ) + + st.sidebar.markdown("---") + st.sidebar.warning( + "⚠️ **Dependencies**: Make sure you have:\n" + "```\n" + "pip install langchain-openai langchain-community\n" + "pip install sentence-transformers\n" + "pip install --upgrade pydantic\n" + "```" + ) + + functions = [ + "home", + "Chat with CSV", + "Analyze CSV", + ] + + selected_function = st.selectbox("Select a functionality", functions) + + if selected_function != "home" and not user_api_key: + st.warning("⚠️ Please enter your OpenRouter API key in the sidebar to use this functionality.") + return + + if selected_function == "home": + home_page() + elif selected_function == "Chat with CSV": + chat(temperature=temperature, model_name=model_name, user_api_key=user_api_key) + elif selected_function == "Analyze CSV": + analyze(temperature=temperature, model_name=model_name, user_api_key=user_api_key) + else: + st.warning("You haven't selected any AI Functionality!!") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Week13/Day1/csv_1.py b/Week13/Day1/csv_1.py new file mode 100644 index 00000000..128677d6 --- /dev/null +++ b/Week13/Day1/csv_1.py @@ -0,0 +1,581 @@ +# imports +import streamlit as st +import os, tempfile +import pandas as pd +from langchain_openai import ChatOpenAI +from langchain_community.vectorstores import FAISS +from langchain_huggingface import HuggingFaceEmbeddings +from langchain_text_splitters import RecursiveCharacterTextSplitter +from langchain_community.document_loaders import CSVLoader +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +from langchain_core.runnables.history import RunnableWithMessageHistory +from langchain_community.chat_message_histories import ChatMessageHistory +from langchain_core.chat_history import BaseChatMessageHistory +from langchain_experimental.agents import create_pandas_dataframe_agent +from langchain.chains.summarize import load_summarize_chain +from langchain_core.output_parsers import PydanticOutputParser, StrOutputParser +from pydantic import BaseModel, Field +from typing import List, Optional +import matplotlib.pyplot as plt +import asyncio +import json + +# Langsmith integration +import langsmith +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() + +# Enable Langsmith tracing (CORRECT format from documentation) +langsmith_key = os.getenv('LANGSMITH_API_KEY') +if langsmith_key: + langsmith_client = langsmith.Client(api_key=langsmith_key) + os.environ["LANGSMITH_TRACING"] = "true" + os.environ["LANGSMITH_API_KEY"] = langsmith_key + os.environ["LANGSMITH_PROJECT"] = "CSV App" + # Set for backward compatibility + os.environ["LANGCHAIN_TRACING_V2"] = "true" + os.environ["LANGCHAIN_PROJECT"] = "CSV App" + +# Pydantic models for structured responses (moved to module level) +class CSVResponse(BaseModel): + """Structured response for CSV queries""" + answer: str = Field(description="The main answer to the user's question") + confidence: float = Field(description="Confidence score from 0-1", ge=0.0, le=1.0) + reasoning: str = Field(description="Brief explanation of how the answer was derived") + data_used: List[str] = Field(description="Key data points used from the CSV", default_factory=list) + +class AnalysisResponse(BaseModel): + """Structured response for CSV analysis""" + summary: str = Field(description="Summary of the analysis") + insights: List[str] = Field(description="Key insights discovered", default_factory=list) + recommendations: List[str] = Field(description="Recommended actions", default_factory=list) + +class SummaryResponse(BaseModel): + """Structured response for CSV summarization""" + main_summary: str = Field(description="Main summary of the CSV content") + key_points: List[str] = Field(description="Most important points", default_factory=list) + data_quality: str = Field(description="Assessment of data quality") + +# MUST be the first Streamlit command +st.set_page_config(page_title="CSV AI", layout="wide") +os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" + +def home_page(): + st.write("""Select any one feature from above sliderbox: \n + 1. Chat with CSV \n + 2. Analyze CSV """) + +@st.cache_resource() +def get_embeddings_model(): + """Initialize and cache the embedding model""" + return HuggingFaceEmbeddings( + model_name="sentence-transformers/all-MiniLM-L6-v2", + model_kwargs={'device': 'cpu'}, + encode_kwargs={'normalize_embeddings': True} + ) + +# Remove caching from retriever_func to avoid API key issues +def retriever_func(uploaded_file): + if uploaded_file: + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + tmp_file.write(uploaded_file.getvalue()) + tmp_file_path = tmp_file.name + try: + loader = CSVLoader(file_path=tmp_file_path, encoding="utf-8") + data = loader.load() + except: + loader = CSVLoader(file_path=tmp_file_path, encoding="cp1252") + data = loader.load() + + text_splitter = RecursiveCharacterTextSplitter( + chunk_size=1000, + chunk_overlap=200, + add_start_index=True + ) + all_splits = text_splitter.split_documents(data) + + # Use free HuggingFace embeddings (no API key required) + embeddings = get_embeddings_model() + vectorstore = FAISS.from_documents(documents=all_splits, embedding=embeddings) + retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 6}) + + # Clean up temp file + os.remove(tmp_file_path) + return retriever, vectorstore + else: + st.info("Please upload CSV documents to continue.") + st.stop() + +def chat(temperature, model_name, user_api_key): + st.write("# Talk to CSV") + reset = st.sidebar.button("Reset Chat") + uploaded_file = st.sidebar.file_uploader("Upload your CSV here 👇:", type="csv") + + if not uploaded_file: + st.info("Please upload a CSV file to start chatting.") + return + + # Check if API key is valid + if not user_api_key or user_api_key == "": + st.error("❌ Please enter your OpenRouter API key in the sidebar to use this functionality.") + return + + try: + retriever, vectorstore = retriever_func(uploaded_file) + except Exception as e: + st.error(f"❌ Error processing CSV file: {str(e)}") + return + + # Configure LLM for OpenRouter with explicit API key + try: + # Reduce max_tokens to fit within credit limit + max_tokens = 1000 # Reduced from default to avoid credit issues + + llm = ChatOpenAI( + model=model_name, + temperature=temperature, + streaming=True, + max_tokens=max_tokens, + base_url="https://openrouter.ai/api/v1", + api_key=user_api_key, + default_headers={ + "HTTP-Referer": "https://localhost:8501", + "X-Title": "CSV AI App" + } + ) + if "grok" in model_name.lower(): + st.success(f"🤖 Connected to {model_name} (max_tokens: {max_tokens}) - FREE MODEL! 🎉") + else: + st.success(f"🤖 Connected to {model_name} (max_tokens: {max_tokens})") + except Exception as e: + error_msg = str(e) + if "402" in error_msg and "credits" in error_msg: + st.error("❌ **Insufficient Credits!**") + st.error("💳 You need more OpenRouter credits to use this model.") + st.error("🔗 Visit: https://openrouter.ai/settings/credits") + st.warning("💡 Try using a smaller model like 'mistralai/mistral-7b-instruct'") + else: + st.error(f"❌ Failed to connect to OpenRouter: {error_msg}") + return + + if "messages" not in st.session_state: + st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you?"}] + + store = {} + + # Enhanced prompt with structured response format + prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + """Use the following pieces of context to answer the question at the end. + If you don't know the answer, just say that you don't know, don't try to make up an answer. + + Context: {context} + + Please provide a structured response in the following JSON format: + {{ + "answer": "Your main answer here", + "confidence": 0.8, + "reasoning": "Brief explanation of how you arrived at the answer", + "data_used": ["key data points from context"] + }}""", + ), + MessagesPlaceholder(variable_name="history"), + ("human", "{input}"), + ] + ) + + # Use Pydantic parser for structured responses + parser = PydanticOutputParser(pydantic_object=CSVResponse) + runnable = prompt | llm | parser + + def get_session_history(session_id: str) -> BaseChatMessageHistory: + if session_id not in store: + store[session_id] = ChatMessageHistory() + return store[session_id] + + with_message_history = RunnableWithMessageHistory( + runnable, + get_session_history, + input_messages_key="input", + history_messages_key="history", + ) + + for msg in st.session_state.messages: + st.chat_message(msg["role"]).write(msg["content"]) + + # Handle chat input + if prompt := st.chat_input(): + st.session_state.messages.append({"role": "user", "content": prompt}) + st.chat_message("user").write(prompt) + + try: + # Get context from vectorstore + context_results = vectorstore.similarity_search(prompt, k=6) + context = "\n\n".join(doc.page_content for doc in context_results) + + with st.chat_message("assistant"): + message_placeholder = st.empty() + full_response = "" + + # Use streaming response + try: + # Get structured response from model + response = with_message_history.invoke( + {"context": context, "input": prompt}, + config={"configurable": {"session_id": "abc123"}} + ) + + if isinstance(response, CSVResponse): + # Format structured response nicely + full_response = f""" +**Answer:** {response.answer} + +**Confidence:** {response.confidence:.2f} + +**Reasoning:** {response.reasoning} +""" + if response.data_used: + full_response += f"\n**Data Used:**\n" + "\n".join(f"• {item}" for item in response.data_used) + elif hasattr(response, 'content'): + full_response = response.content + else: + full_response = str(response) + + # Display the response + message_placeholder.markdown(full_response) + + # Show raw JSON in expander for debugging + with st.expander("🔍 Raw Response (Debug)"): + if isinstance(response, CSVResponse): + st.json({ + "answer": response.answer, + "confidence": response.confidence, + "reasoning": response.reasoning, + "data_used": response.data_used + }) + else: + st.text(str(response)) + + except Exception as stream_error: + st.error(f"❌ Response parsing error: {stream_error}") + # Fallback to basic response + try: + response = with_message_history.invoke( + {"context": context, "input": prompt}, + config={"configurable": {"session_id": "abc123"}} + ) + full_response = response.content if hasattr(response, 'content') else str(response) + message_placeholder.markdown(f"**Basic Response:**\n\n{full_response}") + except Exception as fallback_error: + st.error(f"❌ Complete failure: {fallback_error}") + full_response = "Sorry, I encountered an error processing your request. Please try rephrasing your question." + + st.session_state.messages.append({"role": "assistant", "content": full_response}) + + except Exception as e: + st.error(f"❌ Error processing your question: {str(e)}") + st.session_state.messages.append({"role": "assistant", "content": "Sorry, I encountered an error processing your request."}) + + # Handle reset button + if reset: + st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you?"}] + st.rerun() + +def summary(model_name, temperature, top_p, user_api_key): + st.write("# Summary of CSV") + st.write("Upload your document here:") + uploaded_file = st.file_uploader("Upload source document", type="csv", label_visibility="collapsed") + + if not user_api_key or user_api_key == "": + st.error("❌ Please enter your OpenRouter API key in the sidebar to use this functionality.") + return + + if uploaded_file is not None: + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + tmp_file.write(uploaded_file.getvalue()) + tmp_file_path = tmp_file.name + + text_splitter = RecursiveCharacterTextSplitter(chunk_size = 1024, chunk_overlap=100) + try: + loader = CSVLoader(file_path=tmp_file_path, encoding="cp1252") + data = loader.load() + texts = text_splitter.split_documents(data) + except: + loader = CSVLoader(file_path=tmp_file_path, encoding="utf-8") + data = loader.load() + texts = text_splitter.split_documents(data) + + os.remove(tmp_file_path) + + st.info(f"📄 Loaded {len(texts)} text chunks from your CSV file") + + gen_sum = st.button("Generate Summary") + if gen_sum: + with st.spinner("Generating summary... This may take a moment."): + try: + # Reduce max_tokens to fit within credit limit + max_tokens = 1000 + + llm = ChatOpenAI( + model=model_name, + temperature=temperature, + max_tokens=max_tokens, + base_url="https://openrouter.ai/api/v1", + api_key=user_api_key, + default_headers={ + "HTTP-Referer": "https://localhost:8501", + "X-Title": "CSV AI App" + } + ) + st.success(f"🤖 Connected to {model_name} for summarization (max_tokens: {max_tokens})") + chain = load_summarize_chain( + llm=llm, + chain_type="map_reduce", + return_intermediate_steps=True, + input_key="input_documents", + output_key="output_text", + ) + result = chain({"input_documents": texts}, return_only_outputs=True) + st.success("✅ Summary generated successfully!") + st.markdown("### 📋 Summary:") + st.write(result["output_text"]) + except Exception as e: + st.error(f"❌ Error generating summary: {str(e)}") + st.info("💡 Try using a smaller CSV file or check your API key.") + +def analyze(temperature, model_name, user_api_key): + st.write("# Analyze CSV") + reset = st.sidebar.button("Reset Chat") + uploaded_file = st.sidebar.file_uploader("Upload your CSV here 👇:", type="csv") + + if not user_api_key or user_api_key == "": + st.error("❌ Please enter your OpenRouter API key in the sidebar to use this functionality.") + return + + if uploaded_file is not None: + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + tmp_file.write(uploaded_file.getvalue()) + tmp_file_path = tmp_file.name + + df = pd.read_csv(tmp_file_path) + os.remove(tmp_file_path) + + st.info(f"📊 CSV loaded: {df.shape[0]} rows × {df.shape[1]} columns") + + with st.expander("📋 Column Information"): + st.write("**Columns:**", list(df.columns)) + st.write("**Data Types:**") + st.write(df.dtypes) + + try: + # Reduce max_tokens to fit within credit limit + max_tokens = 1000 + + llm = ChatOpenAI( + model=model_name, + temperature=temperature, + max_tokens=max_tokens, + base_url="https://openrouter.ai/api/v1", + api_key=user_api_key, + default_headers={ + "HTTP-Referer": "https://localhost:8501", + "X-Title": "CSV AI App" + } + ) + st.success(f"🤖 Connected to {model_name} for analysis (max_tokens: {max_tokens})") + except Exception as e: + st.error(f"❌ Failed to connect to OpenRouter: {str(e)}") + return + + try: + agent = create_pandas_dataframe_agent( + llm, + df, + agent_type="openai-tools", + verbose=True, + allow_dangerous_code=True, + handle_parsing_errors=True, + prefix=""" +You are working with a pandas dataframe in Python. The name of the dataframe is `df`. +When creating visualizations: +1. Always use matplotlib.pyplot as plt +2. Always call plt.show() after creating plots +3. Use st.pyplot() to display plots in Streamlit +4. For better display, set figure size with plt.figure(figsize=(10, 6)) + +You should use the tools below to answer the question posed of you: +""" + ) + except Exception as e: + st.error(f"❌ Error creating agent: {str(e)}") + st.stop() + + if "messages" not in st.session_state: + st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you analyze your CSV data? I can create visualizations, calculate statistics, and answer questions about your data."}] + + for msg in st.session_state.messages: + st.chat_message(msg["role"]).write(msg["content"]) + + if prompt := st.chat_input(placeholder="Try: 'Create a histogram of column X' or 'Show correlation between columns'"): + st.session_state.messages.append({"role": "user", "content": prompt}) + st.chat_message("user").write(prompt) + + try: + with st.spinner("Analyzing..."): + import matplotlib.pyplot as plt + + enhanced_prompt = f""" +{prompt} + +Important instructions for visualizations: +- Import matplotlib.pyplot as plt if creating plots +- Set figure size: plt.figure(figsize=(10, 6)) +- After creating plots, use st.pyplot(plt.gcf()) to display in Streamlit +- Then call plt.close() to clear the figure +- Always show the plot using these Streamlit commands +""" + + msg = agent.invoke({"input": enhanced_prompt, "chat_history": st.session_state.messages}) + + if plt.get_fignums(): + st.pyplot(plt.gcf()) + plt.close() + + st.session_state.messages.append({"role": "assistant", "content": msg["output"]}) + st.chat_message("assistant").write(msg["output"]) + except Exception as e: + error_msg = f"❌ Error: {str(e)}" + st.session_state.messages.append({"role": "assistant", "content": error_msg}) + st.chat_message("assistant").write(error_msg) + + if reset: + st.session_state["messages"] = [] + + st.sidebar.markdown("---") + st.sidebar.warning( + "⚠️ **Security Notice**: This feature executes Python code to analyze your data. " + "Only use with trusted CSV files." + ) + + st.sidebar.markdown("---") + st.sidebar.success( + "💡 **Try these commands**:\n" + "- 'Show the first 5 rows'\n" + "- 'Create a histogram of [column]'\n" + "- 'Calculate correlation matrix'\n" + "- 'Plot [column1] vs [column2]'\n" + "- 'Show summary statistics'" + ) + +# Main App +def main(): + st.markdown( + """ +
+

🧠 CSV AI

+
+ """, + unsafe_allow_html=True, + ) + st.markdown( + """ +
+

⚡️ Interacting, Analyzing and Summarizing CSV Files!

+
+ """, + unsafe_allow_html=True, + ) + + # Check for OpenRouter API key + if os.path.exists(".env") and os.environ.get("OPENROUTER_API_KEY"): + user_api_key = os.environ["OPENROUTER_API_KEY"] + st.success("OpenRouter API key loaded from .env", icon="🚀") + else: + user_api_key = st.sidebar.text_input( + label="#### Enter OpenRouter API key 👇", + placeholder="Paste your OpenRouter API key, sk-or-v1-...", + type="password", + key="openrouter_api_key" + ) + if user_api_key: + st.sidebar.success("OpenRouter API key loaded", icon="🚀") + + # OpenRouter model options + MODEL_OPTIONS = [ + "x-ai/grok-4-fast:free", + "openai/gpt-4o", + "openai/gpt-4o-mini", + "openai/gpt-4-turbo", + "openai/gpt-3.5-turbo", + "anthropic/claude-3-5-sonnet-20241022", + "anthropic/claude-3-haiku-20240307", + "meta-llama/llama-3.1-70b-instruct", + "meta-llama/llama-3.1-8b-instruct", + "google/gemini-pro-1.5-latest", + "mistralai/mistral-7b-instruct" + ] + + TEMPERATURE_MIN_VALUE = 0.0 + TEMPERATURE_MAX_VALUE = 1.0 + TEMPERATURE_DEFAULT_VALUE = 0.9 + TEMPERATURE_STEP = 0.01 + + model_name = st.sidebar.selectbox( + label="Model", + options=MODEL_OPTIONS, + index=MODEL_OPTIONS.index("x-ai/grok-4-fast:free") # Set Grok as default + ) + top_p = st.sidebar.slider("Top_P", 0.0, 1.0, 1.0, 0.1) + temperature = st.sidebar.slider( + label="Temperature", + min_value=TEMPERATURE_MIN_VALUE, + max_value=TEMPERATURE_MAX_VALUE, + value=TEMPERATURE_DEFAULT_VALUE, + step=TEMPERATURE_STEP,) + + st.sidebar.markdown("---") + st.sidebar.info( + "💡 **Setup**:\n" + "- **OpenRouter API**: For chat models ([openrouter.ai](https://openrouter.ai))\n" + "- **Embeddings**: Free HuggingFace model (no API key needed!)\n\n" + "🚀 **Using**: `sentence-transformers/all-MiniLM-L6-v2`\n" + "🎯 **Free Model**: `x-ai/grok-4-fast:free` (default)" + ) + + st.sidebar.markdown("---") + st.sidebar.warning( + "⚠️ **Dependencies**: Make sure you have:\n" + "```\n" + "pip install langchain-openai langchain-community\n" + "pip install sentence-transformers\n" + "pip install --upgrade pydantic\n" + "```" + ) + + functions = [ + "home", + "Chat with CSV", + "Analyze CSV", + ] + + selected_function = st.selectbox("Select a functionality", functions) + + if selected_function != "home" and not user_api_key: + st.warning("⚠️ Please enter your OpenRouter API key in the sidebar to use this functionality.") + return + + if selected_function == "home": + home_page() + elif selected_function == "Chat with CSV": + chat(temperature=temperature, model_name=model_name, user_api_key=user_api_key) + elif selected_function == "Analyze CSV": + analyze(temperature=temperature, model_name=model_name, user_api_key=user_api_key) + else: + st.warning("You haven't selected any AI Functionality!!") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Week13/Day1/simple_lcel.py b/Week13/Day1/simple_lcel.py new file mode 100644 index 00000000..ed7890c9 --- /dev/null +++ b/Week13/Day1/simple_lcel.py @@ -0,0 +1,225 @@ +# LangChain Chain Types Tutorial +# This tutorial demonstrates Simple Chain, Sequential Chain, and Simple Sequential Chain + +import os +from langchain_openai import ChatOpenAI +from langchain_core.prompts import PromptTemplate, ChatPromptTemplate +from langchain_core.output_parsers import StrOutputParser +from langchain.chains import LLMChain, SequentialChain, SimpleSequentialChain + +# Set your OpenAI API key +# os.environ["OPENAI_API_KEY"] = "your-api-key-here" + +# Initialize the LLM +llm = ChatOpenAI( + model="gpt-3.5-turbo", + temperature=0.7, + max_tokens=500 +) + +print("🚀 LangChain Chain Types Tutorial") +print("=" * 50) + +# ============================================================================ +# 1. SIMPLE CHAIN (Single Input/Output) +# ============================================================================ +print("\n1️⃣ SIMPLE CHAIN") +print("-" * 20) + +# Create a prompt template for generating a story +story_prompt = ChatPromptTemplate.from_template( + "Write a short creative story (2-3 sentences) about {topic}. Make it interesting and engaging." +) + +# Create a simple chain: Prompt → LLM → Output Parser +simple_chain = story_prompt | llm + + +# Create a simple LLMChain +simple_chain = LLMChain( + llm=llm, + prompt=story_prompt, +) + +# Execute the simple chain +topic = "a robot learning to paint" +story_result = simple_chain.invoke({"topic": topic}) +print(f"Topic: {topic}") +print(f"Generated Story: {story_result}") + +# ============================================================================ +# 2. SIMPLE SEQUENTIAL CHAIN (Output of Chain 1 → Input of Chain 2) +# ============================================================================ +print("\n2️⃣ SIMPLE SEQUENTIAL CHAIN") +print("-" * 25) + +# Chain 1: Generate a business idea +idea_prompt = ChatPromptTemplate.from_template( + "Generate a creative business idea for the industry: {industry}. " + "Provide just the business idea in one sentence." +) +idea_chain = idea_prompt | llm | StrOutputParser() + +# Chain 2: Create a marketing slogan for the business idea +slogan_prompt = ChatPromptTemplate.from_template( + "Create a catchy marketing slogan for this business idea: {business_idea}. " + "Make it memorable and under 10 words." +) +slogan_chain = slogan_prompt | llm | StrOutputParser() + +# Create Simple Sequential Chain +# Output from idea_chain automatically becomes input for slogan_chain +simple_sequential_chain = SimpleSequentialChain( + chains=[idea_chain, slogan_chain], + verbose=True # Shows intermediate outputs +) + +# Execute the chain +industry = "sustainable technology" +final_result = simple_sequential_chain.invoke({"input": industry}) +print(f"Industry: {industry}") +print(f"Final Marketing Slogan: {final_result['output']}") + +# ============================================================================ +# 3. SEQUENTIAL CHAIN (Multiple Inputs/Outputs with Named Variables) +# ============================================================================ +print("\n3️⃣ SEQUENTIAL CHAIN") +print("-" * 18) + +# Chain 1: Analyze a product concept +analysis_prompt = PromptTemplate( + input_variables=["product_name", "target_market"], + template=""" + Analyze this product concept: + Product: {product_name} + Target Market: {target_market} + + Provide a brief market analysis (2-3 sentences). + """ +) +analysis_chain = LLMChain( + llm=llm, + prompt=analysis_prompt, + output_key="market_analysis" # Named output +) + +# Chain 2: Generate pricing strategy +pricing_prompt = PromptTemplate( + input_variables=["product_name", "market_analysis"], + template=""" + Based on this market analysis: {market_analysis} + + Suggest a pricing strategy for {product_name}. + Include price range and reasoning (2-3 sentences). + """ +) +pricing_chain = LLMChain( + llm=llm, + prompt=pricing_prompt, + output_key="pricing_strategy" # Named output +) + +# Chain 3: Create final business plan summary +business_plan_prompt = PromptTemplate( + input_variables=["product_name", "target_market", "market_analysis", "pricing_strategy"], + template=""" + Create a concise business plan summary using: + + Product: {product_name} + Target Market: {target_market} + Market Analysis: {market_analysis} + Pricing Strategy: {pricing_strategy} + + Summarize in 3-4 sentences focusing on key opportunities. + """ +) +business_plan_chain = LLMChain( + llm=llm, + prompt=business_plan_prompt, + output_key="business_plan" # Named output +) + +# Create Sequential Chain with multiple named inputs/outputs +sequential_chain = SequentialChain( + chains=[analysis_chain, pricing_chain, business_plan_chain], + input_variables=["product_name", "target_market"], # Initial inputs + output_variables=["market_analysis", "pricing_strategy", "business_plan"], # All outputs + verbose=True # Shows all intermediate steps +) + +# Execute the sequential chain +inputs = { + "product_name": "Smart Fitness Mirror", + "target_market": "health-conscious millennials" +} + +sequential_result = sequential_chain.invoke(inputs) + +print("📊 SEQUENTIAL CHAIN RESULTS:") +print(f"Product: {inputs['product_name']}") +print(f"Target Market: {inputs['target_market']}") +print(f"\n📈 Market Analysis:\n{sequential_result['market_analysis']}") +print(f"\n💰 Pricing Strategy:\n{sequential_result['pricing_strategy']}") +print(f"\n📋 Business Plan:\n{sequential_result['business_plan']}") + +# ============================================================================ +# SUMMARY OF DIFFERENCES +# ============================================================================ +print("\n" + "=" * 60) +print("📚 SUMMARY OF CHAIN TYPES") +print("=" * 60) + +print(""" +1️⃣ SIMPLE CHAIN: + • Single operation: Prompt → LLM → Output + • Uses: prompt | llm | parser syntax + • Best for: Individual tasks + +2️⃣ SIMPLE SEQUENTIAL CHAIN: + • Multiple chains in sequence + • Output of Chain 1 → Input of Chain 2 + • Single input/output flow + • Best for: Linear workflows + +3️⃣ SEQUENTIAL CHAIN: + • Multiple chains with named variables + • Can handle multiple inputs/outputs + • More complex data flow + • Best for: Complex multi-step processes +""") + +# ============================================================================ +# PRACTICAL EXAMPLE: Content Creation Pipeline +# ============================================================================ +print("\n🎯 PRACTICAL EXAMPLE: Blog Post Creation Pipeline") +print("-" * 50) + +# Step 1: Generate blog topics +topic_generator = ChatPromptTemplate.from_template( + "Generate 3 engaging blog post topics about {subject}. List them numbered 1-3." +) | llm | StrOutputParser() + +# Step 2: Pick first topic and create outline +outline_generator = ChatPromptTemplate.from_template( + "From these topics: {topics}\n\nPick the first topic and create a detailed outline with 4 main points." +) | llm | StrOutputParser() + +# Step 3: Write introduction +intro_writer = ChatPromptTemplate.from_template( + "Based on this outline: {outline}\n\nWrite an engaging introduction paragraph (3-4 sentences)." +) | llm | StrOutputParser() + +# Create content pipeline +content_pipeline = SimpleSequentialChain( + chains=[topic_generator, outline_generator, intro_writer], + verbose=True +) + +# Execute content creation pipeline +subject = "artificial intelligence in healthcare" +content_result = content_pipeline.invoke({"input": subject}) + +print(f"Subject: {subject}") +print(f"Final Blog Introduction:\n{content_result['output']}") + +print("\n✅ Tutorial Complete! You've learned all three chain types in LangChain.") \ No newline at end of file diff --git a/Week13/Day1/simple_without_lcel.py b/Week13/Day1/simple_without_lcel.py new file mode 100644 index 00000000..352115c9 --- /dev/null +++ b/Week13/Day1/simple_without_lcel.py @@ -0,0 +1,288 @@ +# LangChain Chain Types Tutorial (Traditional Approach - No LCEL) +# This tutorial demonstrates Simple Chain, Sequential Chain, and Simple Sequential Chain + +import os +from langchain_openai import ChatOpenAI +from langchain.prompts import PromptTemplate +from langchain.chains import LLMChain, SequentialChain, SimpleSequentialChain +from langchain.schema import BaseOutputParser + +# Set your OpenAI API key +# os.environ["OPENAI_API_KEY"] = "your-api-key-here" + +# Initialize the LLM +llm = ChatOpenAI( + model="gpt-3.5-turbo", + temperature=0.7, + max_tokens=500 +) + +print("🚀 LangChain Chain Types Tutorial (Traditional Approach)") +print("=" * 60) + +# ============================================================================ +# 1. SIMPLE CHAIN (LLMChain - Single Input/Output) +# ============================================================================ +print("\n1️⃣ SIMPLE CHAIN (LLMChain)") +print("-" * 30) + +# Create a prompt template for generating a story +story_prompt = PromptTemplate( + input_variables=["topic"], + template="Write a short creative story (2-3 sentences) about {topic}. Make it interesting and engaging." +) + +# Create a simple LLMChain +simple_chain = LLMChain( + llm=llm, + prompt=story_prompt, + verbose=True # Shows what's happening +) + +# Execute the simple chain +topic = "a robot learning to paint" +story_result = simple_chain.run(topic=topic) # Using .run() for single input +print(f"Topic: {topic}") +print(f"Generated Story: {story_result}") + +# Alternative way to execute +story_result2 = simple_chain.invoke({"topic": "a cat who became a detective"}) +print(f"\nAlternative execution: {story_result2['text']}") + +# ============================================================================ +# 2. SIMPLE SEQUENTIAL CHAIN (Output of Chain 1 → Input of Chain 2) +# ============================================================================ +print("\n2️⃣ SIMPLE SEQUENTIAL CHAIN") +print("-" * 30) + +# Chain 1: Generate a business idea +idea_prompt = PromptTemplate( + input_variables=["industry"], + template="""Generate a creative business idea for the industry: {industry}. + Provide just the business idea in one sentence.""" +) + +idea_chain = LLMChain( + llm=llm, + prompt=idea_prompt +) + +# Chain 2: Create a marketing slogan for the business idea +slogan_prompt = PromptTemplate( + input_variables=["business_idea"], + template="""Create a catchy marketing slogan for this business idea: {business_idea}. + Make it memorable and under 10 words.""" +) + +slogan_chain = LLMChain( + llm=llm, + prompt=slogan_prompt +) + +# Create Simple Sequential Chain +# Note: SimpleSequentialChain only handles single input/output between chains +simple_sequential_chain = SimpleSequentialChain( + chains=[idea_chain, slogan_chain], + verbose=True # Shows intermediate outputs +) + +# Execute the chain +industry = "sustainable technology" +final_result = simple_sequential_chain.run(industry) # Single input with .run() +print(f"Industry: {industry}") +print(f"Final Marketing Slogan: {final_result}") + +# ============================================================================ +# 3. SEQUENTIAL CHAIN (Multiple Inputs/Outputs with Named Variables) +# ============================================================================ +print("\n3️⃣ SEQUENTIAL CHAIN") +print("-" * 20) + +# Chain 1: Analyze a product concept +analysis_prompt = PromptTemplate( + input_variables=["product_name", "target_market"], + template="""Analyze this product concept: + Product: {product_name} + Target Market: {target_market} + + Provide a brief market analysis (2-3 sentences).""" +) + +analysis_chain = LLMChain( + llm=llm, + prompt=analysis_prompt, + output_key="market_analysis" # Named output key +) + +# Chain 2: Generate pricing strategy +pricing_prompt = PromptTemplate( + input_variables=["product_name", "market_analysis"], + template="""Based on this market analysis: {market_analysis} + + Suggest a pricing strategy for {product_name}. + Include price range and reasoning (2-3 sentences).""" +) + +pricing_chain = LLMChain( + llm=llm, + prompt=pricing_prompt, + output_key="pricing_strategy" # Named output key +) + +# Chain 3: Create final business plan summary +business_plan_prompt = PromptTemplate( + input_variables=["product_name", "target_market", "market_analysis", "pricing_strategy"], + template="""Create a concise business plan summary using: + + Product: {product_name} + Target Market: {target_market} + Market Analysis: {market_analysis} + Pricing Strategy: {pricing_strategy} + + Summarize in 3-4 sentences focusing on key opportunities.""" +) + +business_plan_chain = LLMChain( + llm=llm, + prompt=business_plan_prompt, + output_key="business_plan" # Named output key +) + +# Create Sequential Chain with multiple named inputs/outputs +sequential_chain = SequentialChain( + chains=[analysis_chain, pricing_chain, business_plan_chain], + input_variables=["product_name", "target_market"], # Initial inputs + output_variables=["market_analysis", "pricing_strategy", "business_plan"], # All outputs we want + verbose=True # Shows all intermediate steps +) + +# Execute the sequential chain +inputs = { + "product_name": "Smart Fitness Mirror", + "target_market": "health-conscious millennials" +} + +sequential_result = sequential_chain.invoke(inputs) # Using .invoke() for multiple inputs + +print("📊 SEQUENTIAL CHAIN RESULTS:") +print(f"Product: {inputs['product_name']}") +print(f"Target Market: {inputs['target_market']}") +print(f"\n📈 Market Analysis:\n{sequential_result['market_analysis']}") +print(f"\n💰 Pricing Strategy:\n{sequential_result['pricing_strategy']}") +print(f"\n📋 Business Plan:\n{sequential_result['business_plan']}") + +# ============================================================================ +# ADVANCED EXAMPLE: Custom Output Parser +# ============================================================================ +print("\n🔧 ADVANCED: Custom Output Parser") +print("-" * 35) + +class ListOutputParser(BaseOutputParser): + """Custom parser to extract list items from LLM output.""" + + def parse(self, text: str): + """Parse the output into a list.""" + lines = text.strip().split('\n') + return [line.strip('- ').strip() for line in lines if line.strip()] + +# Chain with custom parser +list_prompt = PromptTemplate( + input_variables=["topic", "count"], + template="Generate {count} creative ideas for {topic}. Format as a bullet list with - in front of each item." +) + +list_chain = LLMChain( + llm=llm, + prompt=list_prompt, + output_parser=ListOutputParser() # Custom parser +) + +ideas = list_chain.run(topic="team building activities", count="5") +print("Generated Ideas:") +for i, idea in enumerate(ideas, 1): + print(f"{i}. {idea}") + +# ============================================================================ +# MULTIPLE WAYS TO EXECUTE CHAINS +# ============================================================================ +print("\n⚙️ EXECUTION METHODS") +print("-" * 25) + +# Method 1: Using .run() for simple inputs +result1 = simple_chain.run("a magical library") +print(f"Method 1 (.run()): {result1[:50]}...") + +# Method 2: Using .invoke() for structured inputs +result2 = simple_chain.invoke({"topic": "a time-traveling chef"}) +print(f"Method 2 (.invoke()): {result2['text'][:50]}...") + +# Method 3: Using .apply() for multiple inputs at once +inputs_batch = [ + {"topic": "a singing tree"}, + {"topic": "a dancing cloud"}, + {"topic": "a wise old computer"} +] +results_batch = simple_chain.apply(inputs_batch) +print("Method 3 (.apply() - batch processing):") +for i, result in enumerate(results_batch): + print(f" Story {i+1}: {result['text'][:40]}...") + +# ============================================================================ +# SUMMARY OF DIFFERENCES +# ============================================================================ +print("\n" + "=" * 60) +print("📚 SUMMARY OF TRADITIONAL CHAIN TYPES") +print("=" * 60) + +print(""" +1️⃣ SIMPLE CHAIN (LLMChain): + • Structure: LLMChain(llm, prompt, output_parser) + • Single prompt template + LLM + • Execute with: .run(), .invoke(), .apply() + • Best for: Individual tasks + +2️⃣ SIMPLE SEQUENTIAL CHAIN: + • Structure: SimpleSequentialChain([chain1, chain2, ...]) + • Output of Chain 1 → Input of Chain 2 + • Single string input/output between chains + • Execute with: .run() for single input + • Best for: Linear workflows with simple data flow + +3️⃣ SEQUENTIAL CHAIN: + • Structure: SequentialChain(chains, input_variables, output_variables) + • Multiple named inputs/outputs + • Complex data flow between chains + • Execute with: .invoke() for multiple inputs + • Best for: Complex multi-step processes + +KEY DIFFERENCES FROM LCEL: +• No | (pipe) operator +• Explicit LLMChain construction +• Traditional .run(), .invoke(), .apply() methods +• More verbose but clearer separation of concerns +""") + +# ============================================================================ +# PRACTICAL COMPARISON: Same Task, Different Approaches +# ============================================================================ +print("\n🎯 PRACTICAL COMPARISON") +print("-" * 25) + +# Traditional LLMChain approach +traditional_prompt = PromptTemplate( + input_variables=["language", "difficulty"], + template="Create a {difficulty} level programming exercise in {language}. Include the problem and solution." +) + +traditional_chain = LLMChain( + llm=llm, + prompt=traditional_prompt +) + +# Execute traditional chain +exercise = traditional_chain.run(language="Python", difficulty="beginner") +print("Traditional LLMChain Result:") +print(exercise[:100] + "...") + +print("\n✅ Tutorial Complete!") +print("You've learned all three traditional chain types without LCEL!") \ No newline at end of file diff --git a/Week15/Day1/README.md b/Week15/Day1/README.md new file mode 100644 index 00000000..eeacdf3a --- /dev/null +++ b/Week15/Day1/README.md @@ -0,0 +1,16 @@ +## Setup Instructions + + +```python +pip install openai tiktoken anthropic python-dotenv google-genai +``` + + +## .env file with following values + +``` +OPENAI_API_KEY= +OPENROUTER_API_KEY= +ANTHROPIC_API_KEY= +GEMINI_API_KEY= +``` \ No newline at end of file diff --git a/Week15/Day1/batch.ipynb b/Week15/Day1/batch.ipynb new file mode 100644 index 00000000..475b3a36 --- /dev/null +++ b/Week15/Day1/batch.ipynb @@ -0,0 +1,358 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "e4b2ad14", + "metadata": {}, + "outputs": [], + "source": [ + "import os, json, time, tempfile, pathlib\n", + "from openai import OpenAI\n", + "from dotenv import load_dotenv\n", + "\n", + "load_dotenv()\n", + "\n", + "client = OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"))\n", + "\n", + "\n", + "# Read: https://cookbook.openai.com/examples/batch_processing\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "69fb5527", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'role': 'system', 'content': 'You are a professional, friendly, and detail-oriented travel assistant and booking agent. Your goal is to help users plan trips for vacation, holidays, work, study, conferences, family gatherings, or other purposes. Always tailor your recommendations based on their specific travel reason, budget, trip length, group size, and preferences.\\n\\n## Core Behaviour & Guidelines\\n1. Always greet the user warmly, acknowledging their stated travel reason.\\n2. Ask for missing essential information before finalising a plan: budget, travel companions (number and relationship), planned duration, country of origin, travel dates, and any paperwork or visa considerations.\\n3. For every recommendation, prioritise **accuracy, feasibility, and clarity**. Do not fabricate legal or visa information; instead, guide the user to authoritative, official sources if you cannot confirm something.\\n4. Present all responses in a **clear, structured format** with headings, subheadings, and bullet points. Avoid long unbroken paragraphs.\\n5. Use live citations for legal requirements, visa rules, and regulations (link to official government or embassy websites).\\n6. Always factor in seasonal/weather considerations, public holidays, festivals, or peak seasons at the destination.\\n7. Assume the user might be a first-time visitor to the destination, so include context and practical tips.\\n\\n## Required Output Format for Final Plan\\n### Summary\\nTraveling from: {city, country} — {departure date in MMM DD, YY}\\nTraveling to: {city, country} — {arrival date in MMM DD, YY}\\n[Destination + duration of stay] (repeat for each stop in multi-destination trips)\\nTravel reason: {reason}\\nBudget: {currency symbol}{amount}\\nTraveling with: {description of group, number of people}\\n\\n### Legal Requirements\\nVisa Requirements:\\n- [bullet points with requirement summaries]\\n- Each requirement should include a short rationale (why needed)\\nWhere to Apply for Visa:\\n- [official website links]\\nHow Long Before to Start Planning:\\n- [bullet points with recommendations]\\nOther Legal Requirements:\\n- [bullet points; include permits, health requirements, insurance obligations]\\n\\n### Popular Flight Options — Departure\\n[table with columns: Airline, Cost, Duration, Stops, Notes — top 10 sorted by best balance of cost and time]\\n\\n### Popular Flight Options — Return\\n[table with same columns — top 10]\\n\\n### Itinerary for [Destination]\\n(Repeat this section for each destination in a multi-destination trip)\\n1. Account for arrival time, rest and recovery, and local transport availability.\\n2. Ensure key attractions or events have enough allocated time.\\n3. Add seasonal or holiday-specific adjustments.\\n4. For each trip from point A to B, list three viable transport options, best first, with pros/cons.\\n5. Where applicable, include unique, lesser-known experiences.\\n6. Mention potential risks (weather, strikes, closures).\\n\\n## Additional Assistant Duties\\n- **Budget sensitivity:** Adapt recommendations to the user\\'s stated budget — avoid suggesting overly expensive options unless user explicitly requests luxury.\\n- **Safety & security:** If a region has travel advisories, highlight them with a direct link to the advisory source.\\n- **Cultural tips:** Provide etiquette, language basics, and do\\'s/don\\'ts for each destination.\\n- **Accessibility:** Where possible, note if destinations, hotels, or transport are accessible for people with disabilities.\\n- **Food & dining:** Suggest must-try local dishes and safe eating practices.\\n- **Packing suggestions:** List climate-appropriate packing items based on travel dates and weather data.\\n- **Connectivity:** Include info on SIM cards, eSIMs, and Wi-Fi availability.\\n\\n## Example Few-Shot Demonstrations\\n### Example 1 — Short Domestic Trip\\nUser: \"I’m going to Kyoto for 4 days during cherry blossom season.\"\\nAssistant:\\n[Provide full structured plan, including legal requirements if applicable, suggested itinerary with cherry blossom viewing spots, transport, hotel areas, and seasonal notes]\\n\\n### Example 2 — International Conference\\nUser: \"I’m attending a 5-day tech conference in Berlin from India.\"\\nAssistant:\\n[Structured plan with visa info, nearby hotels to conference venue, cultural etiquette, SIM card options, evening activities]\\n\\n### Example 3 — Family Vacation\\nUser: \"Family trip to New Zealand for 2 weeks from the UK.\"\\nAssistant:\\n[Structured plan with multi-destination itinerary, driving route, child-friendly attractions, budget-conscious accommodation]\\n\\n---\\nAlways adhere to the structure and depth demonstrated above. Do not skip sections unless the user explicitly instructs otherwise. If unsure, do not include data, or ask quesitons, or point user on where to get relevant info. Do not give information you are yourself not sure about. If tools are not available like websearch, etc. — inform the user about the same and give them alternatives on how they could find the information themslves (use appologetic tone here). For most chit, chats — keep the answers super crisp. Before answering user\\'s question — ask all the necessary questions/ask for the information you\\'d need to be able to answer their questions '}, {'role': 'user', 'content': 'What is the capital of France?'}, {'role': 'assistant', 'content': 'The capital of France is Paris.'}, {'role': 'user', 'content': 'Write me 3 paragraphs about paris and a list of places to visit'}, {'role': 'assistant', 'content': '**Paris** is the capital and largest city of France, known globally for its art, fashion, gastronomy, and culture. Situated on the River Seine, Paris has been a major center of finance, diplomacy, commerce, and tourism since the 17th century. Its rich history is reflected in its architecture—from Gothic cathedrals to grand boulevards—and its influence continues to shape global culture and politics.\\n The city is often referred to as \"The City of Light\" due to its leading role during the Age of Enlightenment and its early adoption of street lighting. Paris is home to some of the world’s most visited museums and monuments, including the Louvre, which houses the Mona Lisa, and the Eiffel Tower, which dominates the skyline. Its cafe culture, literary legacy, and culinary excellence further add to its appeal. \\n Paris is divided into 20 districts or *arrondissements*, each with its own character. From the bohemian charm of Montmartre to the elegance of the Marais, every neighborhood offers a unique experience. Whether you\\'re wandering along the Seine, shopping in haute couture boutiques, or enjoying a croissant in a sidewalk café, Paris invites you to slow down and savor the beauty around you. \\n --- \\n ### Must-Visit Places in Paris: \\n * **Eiffel Tower** \\n * **Louvre Museum** \\n * **Notre-Dame Cathedral** \\n * **Sainte-Chapelle** \\n * **Montmartre & Sacré-Cœur** \\n * **Champs-Élysées & Arc de Triomphe** \\n * **Palace of Versailles** (just outside Paris) \\n * **Musée d\\'Orsay** \\n * **Luxembourg Gardens** \\n * **Seine River Cruise** \\n * **Père Lachaise Cemetery** \\n * **Le Marais District** \\n * **Latin Quarter** \\n * **Tuileries Garden** \\n * **Opéra Garnier**'}, {'role': 'user', 'content': 'How many days should I plan for?'}]\n" + ] + } + ], + "source": [ + "# Your conversation (as provided)\n", + "messages = [\n", + " { \"role\": \"system\", \"content\": \"You are a professional, friendly, and detail-oriented travel assistant and booking agent. Your goal is to help users plan trips for vacation, holidays, work, study, conferences, family gatherings, or other purposes. Always tailor your recommendations based on their specific travel reason, budget, trip length, group size, and preferences.\\n\\n## Core Behaviour & Guidelines\\n1. Always greet the user warmly, acknowledging their stated travel reason.\\n2. Ask for missing essential information before finalising a plan: budget, travel companions (number and relationship), planned duration, country of origin, travel dates, and any paperwork or visa considerations.\\n3. For every recommendation, prioritise **accuracy, feasibility, and clarity**. Do not fabricate legal or visa information; instead, guide the user to authoritative, official sources if you cannot confirm something.\\n4. Present all responses in a **clear, structured format** with headings, subheadings, and bullet points. Avoid long unbroken paragraphs.\\n5. Use live citations for legal requirements, visa rules, and regulations (link to official government or embassy websites).\\n6. Always factor in seasonal/weather considerations, public holidays, festivals, or peak seasons at the destination.\\n7. Assume the user might be a first-time visitor to the destination, so include context and practical tips.\\n\\n## Required Output Format for Final Plan\\n### Summary\\nTraveling from: {city, country} — {departure date in MMM DD, YY}\\nTraveling to: {city, country} — {arrival date in MMM DD, YY}\\n[Destination + duration of stay] (repeat for each stop in multi-destination trips)\\nTravel reason: {reason}\\nBudget: {currency symbol}{amount}\\nTraveling with: {description of group, number of people}\\n\\n### Legal Requirements\\nVisa Requirements:\\n- [bullet points with requirement summaries]\\n- Each requirement should include a short rationale (why needed)\\nWhere to Apply for Visa:\\n- [official website links]\\nHow Long Before to Start Planning:\\n- [bullet points with recommendations]\\nOther Legal Requirements:\\n- [bullet points; include permits, health requirements, insurance obligations]\\n\\n### Popular Flight Options — Departure\\n[table with columns: Airline, Cost, Duration, Stops, Notes — top 10 sorted by best balance of cost and time]\\n\\n### Popular Flight Options — Return\\n[table with same columns — top 10]\\n\\n### Itinerary for [Destination]\\n(Repeat this section for each destination in a multi-destination trip)\\n1. Account for arrival time, rest and recovery, and local transport availability.\\n2. Ensure key attractions or events have enough allocated time.\\n3. Add seasonal or holiday-specific adjustments.\\n4. For each trip from point A to B, list three viable transport options, best first, with pros/cons.\\n5. Where applicable, include unique, lesser-known experiences.\\n6. Mention potential risks (weather, strikes, closures).\\n\\n## Additional Assistant Duties\\n- **Budget sensitivity:** Adapt recommendations to the user's stated budget — avoid suggesting overly expensive options unless user explicitly requests luxury.\\n- **Safety & security:** If a region has travel advisories, highlight them with a direct link to the advisory source.\\n- **Cultural tips:** Provide etiquette, language basics, and do's/don'ts for each destination.\\n- **Accessibility:** Where possible, note if destinations, hotels, or transport are accessible for people with disabilities.\\n- **Food & dining:** Suggest must-try local dishes and safe eating practices.\\n- **Packing suggestions:** List climate-appropriate packing items based on travel dates and weather data.\\n- **Connectivity:** Include info on SIM cards, eSIMs, and Wi-Fi availability.\\n\\n## Example Few-Shot Demonstrations\\n### Example 1 — Short Domestic Trip\\nUser: \\\"I’m going to Kyoto for 4 days during cherry blossom season.\\\"\\nAssistant:\\n[Provide full structured plan, including legal requirements if applicable, suggested itinerary with cherry blossom viewing spots, transport, hotel areas, and seasonal notes]\\n\\n### Example 2 — International Conference\\nUser: \\\"I’m attending a 5-day tech conference in Berlin from India.\\\"\\nAssistant:\\n[Structured plan with visa info, nearby hotels to conference venue, cultural etiquette, SIM card options, evening activities]\\n\\n### Example 3 — Family Vacation\\nUser: \\\"Family trip to New Zealand for 2 weeks from the UK.\\\"\\nAssistant:\\n[Structured plan with multi-destination itinerary, driving route, child-friendly attractions, budget-conscious accommodation]\\n\\n---\\nAlways adhere to the structure and depth demonstrated above. Do not skip sections unless the user explicitly instructs otherwise. If unsure, do not include data, or ask quesitons, or point user on where to get relevant info. Do not give information you are yourself not sure about. If tools are not available like websearch, etc. — inform the user about the same and give them alternatives on how they could find the information themslves (use appologetic tone here). For most chit, chats — keep the answers super crisp. Before answering user's question — ask all the necessary questions/ask for the information you'd need to be able to answer their questions \"},\n", + " { \"role\": \"user\", \"content\": \"What is the capital of France?\" },\n", + " { \"role\": \"assistant\", \"content\": \"The capital of France is Paris.\" },\n", + " { \"role\": \"user\", \"content\": \"Write me 3 paragraphs about paris and a list of places to visit\" },\n", + " { \"role\": \"assistant\", \"content\": \"**Paris** is the capital and largest city of France, known globally for its art, fashion, gastronomy, and culture. Situated on the River Seine, Paris has been a major center of finance, diplomacy, commerce, and tourism since the 17th century. Its rich history is reflected in its architecture—from Gothic cathedrals to grand boulevards—and its influence continues to shape global culture and politics.\\n The city is often referred to as \\\"The City of Light\\\" due to its leading role during the Age of Enlightenment and its early adoption of street lighting. Paris is home to some of the world’s most visited museums and monuments, including the Louvre, which houses the Mona Lisa, and the Eiffel Tower, which dominates the skyline. Its cafe culture, literary legacy, and culinary excellence further add to its appeal. \\n Paris is divided into 20 districts or *arrondissements*, each with its own character. From the bohemian charm of Montmartre to the elegance of the Marais, every neighborhood offers a unique experience. Whether you're wandering along the Seine, shopping in haute couture boutiques, or enjoying a croissant in a sidewalk café, Paris invites you to slow down and savor the beauty around you. \\n --- \\n ### Must-Visit Places in Paris: \\n * **Eiffel Tower** \\n * **Louvre Museum** \\n * **Notre-Dame Cathedral** \\n * **Sainte-Chapelle** \\n * **Montmartre & Sacré-Cœur** \\n * **Champs-Élysées & Arc de Triomphe** \\n * **Palace of Versailles** (just outside Paris) \\n * **Musée d'Orsay** \\n * **Luxembourg Gardens** \\n * **Seine River Cruise** \\n * **Père Lachaise Cemetery** \\n * **Le Marais District** \\n * **Latin Quarter** \\n * **Tuileries Garden** \\n * **Opéra Garnier**\" },\n", + " { \"role\": \"user\", \"content\": \"How many days should I plan for?\" },\n", + "]\n", + "\n", + "print(messages)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "815941fc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PosixPath('/var/folders/kl/353z8zps55j1cpm5r0xdnhsw0000gn/T/tmprgh_wcdk/batch_input.jsonl')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create JSONL file\n", + "\n", + "payload = {\n", + " \"custom_id\": \"req-001-paris-days\",\n", + " \"method\": \"POST\",\n", + " \"url\": \"/v1/chat/completions\",\n", + " \"body\": {\n", + " \"model\": \"gpt-4o-mini\",\n", + " \"messages\": messages,\n", + " # Optional tuning knobs:\n", + " \"temperature\": 0.7,\n", + " \"max_tokens\": 100\n", + " },\n", + "}\n", + "\n", + "tmpdir = pathlib.Path(tempfile.mkdtemp())\n", + "input_jsonl_path = tmpdir / \"batch_input.jsonl\"\n", + "with open(input_jsonl_path, \"w\", encoding=\"utf-8\") as f:\n", + " f.write(json.dumps(payload) + \"\\n\")\n", + "\n", + "input_jsonl_path" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "78812321", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'batch_6896b225268c8190aa8b990df872a9f0'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "upload = client.files.create(\n", + " file=open(input_jsonl_path, \"rb\"),\n", + " purpose=\"batch\"\n", + ")\n", + "\n", + "batch = client.batches.create(\n", + " input_file_id=upload.id,\n", + " endpoint=\"/v1/chat/completions\",\n", + " completion_window=\"24h\", # 24h or 4h (if available to your account)\n", + " metadata={\"note\": \"Paris trip planning example\"}\n", + ")\n", + "\n", + "batch.id # You must store this batch ID!" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e819470f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[08:02:36] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:02:47] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:02:57] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:03:08] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:03:19] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:03:30] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:03:41] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:03:52] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:04:03] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:04:14] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:04:25] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:04:36] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:04:46] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:04:57] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:05:08] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:05:19] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:05:30] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:05:40] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:05:52] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:06:02] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:06:13] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:06:24] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:06:35] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:06:46] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:06:56] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:07:07] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:07:18] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:07:29] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:07:40] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:07:50] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:08:01] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:08:12] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:08:23] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:08:34] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:08:45] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:08:56] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:09:06] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:09:17] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:09:29] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:09:40] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:09:50] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:10:01] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:10:12] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:10:23] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:10:34] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:10:45] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:10:56] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:11:07] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:11:17] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:11:28] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:11:39] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:11:50] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:12:01] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:12:12] Status: in_progress | completed=0 failed=0 total=1\n", + "[08:12:22] Status: completed | completed=1 failed=0 total=1\n" + ] + }, + { + "data": { + "text/plain": [ + "'completed'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# --- 3) Poll until the batch completes (or fails) ---\n", + "def wait_for_batch(batch_id: str, poll_secs: int = 10, verbose: bool = True):\n", + " TERMINAL = {\"completed\", \"failed\", \"cancelled\", \"expired\"}\n", + " while True:\n", + " b = client.batches.retrieve(batch_id)\n", + "\n", + " # Defensive reads (some fields can be None while validating)\n", + " rc = getattr(b, \"request_counts\", None)\n", + " completed = getattr(rc, \"completed\", 0) if rc else 0\n", + " failed = getattr(rc, \"failed\", 0) if rc else 0\n", + " total = getattr(rc, \"total\", 0) if rc else 0\n", + "\n", + " if verbose:\n", + " ts = time.strftime(\"%H:%M:%S\")\n", + " print(f\"[{ts}] Status: {b.status:<11} | completed={completed} failed={failed} total={total}\")\n", + "\n", + " if b.status in TERMINAL:\n", + " return b\n", + "\n", + " time.sleep(poll_secs)\n", + "\n", + "final_batch = wait_for_batch(batch.id)\n", + "final_batch.status" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "f16f7763", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1, 1)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# --- 4) Download and parse the output JSONL ---\n", + "if final_batch.status != \"completed\":\n", + " raise RuntimeError(f\"Batch {final_batch.id} ended with status: {final_batch.status}\")\n", + "\n", + "output_file_id = final_batch.output_file_id\n", + "if not output_file_id:\n", + " raise RuntimeError(\"No output_file_id found on the completed batch.\")\n", + "\n", + "# The SDK returns a streaming response; join bytes to get full text\n", + "resp = client.files.content(output_file_id)\n", + "output_bytes = b\"\".join(resp.iter_bytes())\n", + "output_text = output_bytes.decode(\"utf-8\")\n", + "\n", + "assistant_texts = []\n", + "raw_rows = []\n", + "\n", + "for i, line in enumerate(output_text.strip().splitlines(), 1):\n", + " obj = json.loads(line)\n", + " raw_rows.append(obj)\n", + "\n", + " # Each line looks like:\n", + " # {\n", + " # \"id\": \"...\",\n", + " # \"custom_id\": \"req-001-paris-days\",\n", + " # \"response\": {\n", + " # \"status_code\": 200,\n", + " # \"request_id\": \"...\",\n", + " # \"body\": { \"id\": \"...\", \"object\": \"chat.completion\", \"choices\": [...] }\n", + " # }\n", + " # }\n", + " custom_id = obj.get(\"custom_id\")\n", + " resp = obj.get(\"response\", {})\n", + " body = resp.get(\"body\", {}) if isinstance(resp, dict) else {}\n", + "\n", + " content = None\n", + " if isinstance(body, dict):\n", + " # Chat Completions path\n", + " if \"choices\" in body and body.get(\"choices\"):\n", + " content = body[\"choices\"][0].get(\"message\", {}).get(\"content\")\n", + " # (Optional) Responses API path, if you ever use it in future:\n", + " elif \"output_text\" in body:\n", + " content = body[\"output_text\"]\n", + "\n", + " assistant_texts.append({\n", + " \"line\": i,\n", + " \"custom_id\": custom_id,\n", + " \"status_code\": resp.get(\"status_code\"),\n", + " \"content\": content or \"\"\n", + " })\n", + "\n", + "# Keep both parsed assistant texts and raw rows if you want to inspect later\n", + "len(assistant_texts), len(raw_rows)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "00b7e1fa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Reply for req-001-paris-days (status=200) ---\n", + " The ideal number of days to plan for a trip to Paris depends largely on your interests and the experiences you wish to have. Here’s a general guideline:\n", + "\n", + " ### Suggested Duration:\n", + " - **3 Days**: \n", + " - Best for a quick visit to the main attractions such as the Eiffel Tower, Louvre Museum, and Notre-Dame Cathedral. This is suitable if you're on a tight schedule.\n", + " \n", + " - **5 Days**: \n", + " - Allows for a more relaxed pace. You can explore additional areas like\n", + "\n" + ] + } + ], + "source": [ + "# --- 5) Pretty-print just the assistant’s answer(s) ---\n", + "from textwrap import indent\n", + "\n", + "for item in assistant_texts:\n", + " hdr = item[\"custom_id\"] or f\"line-{item['line']}\"\n", + " sc = item.get(\"status_code\")\n", + " print(f\"--- Reply for {hdr} (status={sc}) ---\")\n", + " text = item[\"content\"] if item[\"content\"] else \"[No assistant content in this line]\"\n", + " print(indent(text, \" \"))\n", + " print()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Week15/Day1/cost-session.excalidraw b/Week15/Day1/cost-session.excalidraw new file mode 100644 index 00000000..4be2e40a --- /dev/null +++ b/Week15/Day1/cost-session.excalidraw @@ -0,0 +1,19761 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "TmoMgQwETna6Ch9eCoFN4", + "type": "rectangle", + "x": 301.6492011392336, + "y": 197.1909031624958, + "width": 196.47734445046638, + "height": 301.1774857392586, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0", + "roundness": { + "type": 3 + }, + "seed": 2051524825, + "version": 127, + "versionNonce": 1827144535, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "rf2qz6MO1-eT7kRZmQiav" + }, + { + "id": "MjEvPeGMxyDN65-qqG2Ob", + "type": "arrow" + }, + { + "id": "B4PZlxWCPn5NYd15JYd29", + "type": "arrow" + } + ], + "updated": 1761486522860, + "link": null, + "locked": false + }, + { + "id": "rf2qz6MO1-eT7kRZmQiav", + "type": "text", + "x": 375.9378993044082, + "y": 335.27964603212513, + "width": 47.89994812011719, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 159355001, + "version": 82, + "versionNonce": 1862826167, + "isDeleted": false, + "boundElements": null, + "updated": 1761486517109, + "link": null, + "locked": false, + "text": "LLMs", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TmoMgQwETna6Ch9eCoFN4", + "originalText": "LLMs", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "MjEvPeGMxyDN65-qqG2Ob", + "type": "arrow", + "x": 390.4878676600529, + "y": 105.39782714519089, + "width": 0.3738226343551787, + "height": 91.30397904601591, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": { + "type": 2 + }, + "seed": 1656562457, + "version": 50, + "versionNonce": 148864249, + "isDeleted": false, + "boundElements": null, + "updated": 1761486519996, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.3738226343551787, + 91.30397904601591 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "TmoMgQwETna6Ch9eCoFN4", + "focus": -0.08504993709484772, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "B4PZlxWCPn5NYd15JYd29", + "type": "arrow", + "x": 388.6826487837781, + "y": 501.63688413545975, + "width": 2.3579753603412428, + "height": 99.06173065601973, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a3", + "roundness": { + "type": 2 + }, + "seed": 2053181783, + "version": 30, + "versionNonce": 151216695, + "isDeleted": false, + "boundElements": null, + "updated": 1761486522860, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.3579753603412428, + 99.06173065601973 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "TmoMgQwETna6Ch9eCoFN4", + "focus": 0.1460129883465813, + "gap": 3.2684952337053232 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "qbb8-ZPC0TehmYn-ISEn-", + "type": "text", + "x": 340.9430976808051, + "y": 65.73411984796883, + "width": 99.53993225097656, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4", + "roundness": null, + "seed": 468459479, + "version": 51, + "versionNonce": 1776041497, + "isDeleted": false, + "boundElements": null, + "updated": 1761486553988, + "link": null, + "locked": false, + "text": "Tokens In", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Tokens In", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "pwMMreYwCX7HVwqptACad", + "type": "text", + "x": 335.1670007376668, + "y": 612.8398189025338, + "width": 115.47993469238281, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": null, + "seed": 159259833, + "version": 95, + "versionNonce": 1934768375, + "isDeleted": false, + "boundElements": [], + "updated": 1761486534091, + "link": null, + "locked": false, + "text": "Tokens Out", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Tokens Out", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "TonGQlMtFQIdQbpWUcw_d", + "type": "text", + "x": 646.9192980819895, + "y": 103.04655020346962, + "width": 222.54996309523528, + "height": 56.85421398234331, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6", + "roundness": null, + "seed": 1740596471, + "version": 61, + "versionNonce": 34523641, + "isDeleted": false, + "boundElements": null, + "updated": 1761491024731, + "link": null, + "locked": false, + "text": "Modalities", + "fontSize": 45.48337118587467, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Modalities", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "al38c4U7sx3F8n8SXIVPp", + "type": "text", + "x": 1045.5214165914635, + "y": 187.52534180710995, + "width": 201.2399139404297, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7", + "roundness": null, + "seed": 1614040025, + "version": 231, + "versionNonce": 356173431, + "isDeleted": false, + "boundElements": [ + { + "id": "YfH_Rb1_snc5Jbi-aNnPl", + "type": "arrow" + } + ], + "updated": 1761486760960, + "link": null, + "locked": false, + "text": "Input: $X.XX/Mtok\nOutput: $X.XX/Mtok", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Input: $X.XX/Mtok\nOutput: $X.XX/Mtok", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "VBl8UO1LkMRAYC_qjYXBu", + "type": "text", + "x": 656.1745017724281, + "y": 480.5549379787732, + "width": 70.11996459960938, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a8", + "roundness": null, + "seed": 413876183, + "version": 230, + "versionNonce": 1161501433, + "isDeleted": false, + "boundElements": [], + "updated": 1761486627509, + "link": null, + "locked": false, + "text": "Output", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Output", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YeZdHIjKqqlKlbFZWbPOb", + "type": "text", + "x": 692.2848245656479, + "y": 231.15587462240507, + "width": 57.51995849609375, + "height": 100, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a9", + "roundness": null, + "seed": 412703415, + "version": 235, + "versionNonce": 1276585305, + "isDeleted": false, + "boundElements": [ + { + "id": "QOHOjM__Wbt0-cbgzTHtM", + "type": "arrow" + } + ], + "updated": 1761486772442, + "link": null, + "locked": false, + "text": "Text\nAudio\nImage\nVideo", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Text\nAudio\nImage\nVideo", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "a_JvCwTwL08JvgjKuh1AC", + "type": "text", + "x": 718.0656936472938, + "y": 513.6762937153035, + "width": 110.79991149902344, + "height": 150, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aA", + "roundness": null, + "seed": 1491098647, + "version": 361, + "versionNonce": 762906745, + "isDeleted": false, + "boundElements": [], + "updated": 1761489723390, + "link": null, + "locked": false, + "text": "Text\nReasoning\nAudio\nImage\nVideo\nEmbeddings", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Text\nReasoning\nAudio\nImage\nVideo\nEmbeddings", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4VTxK4jb0SK495sGVVz88", + "type": "text", + "x": 1058.7884302665038, + "y": 95.85269526231934, + "width": 145.67236328125, + "height": 56.85421398234333, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aB", + "roundness": null, + "seed": 304695737, + "version": 170, + "versionNonce": 1056574009, + "isDeleted": false, + "boundElements": null, + "updated": 1761488327050, + "link": null, + "locked": false, + "text": "Pricing", + "fontSize": 45.48337118587467, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Pricing", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "jTb2sEpOt0UWYIYLLt0r_", + "type": "text", + "x": 618.5704025837849, + "y": -107.38787293227857, + "width": 187.1170017288339, + "height": 33.579341768962124, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aD", + "roundness": null, + "seed": 1894867641, + "version": 259, + "versionNonce": 1119308025, + "isDeleted": false, + "boundElements": [], + "updated": 1761486674030, + "link": null, + "locked": false, + "text": "Pricing / Rate", + "fontSize": 26.863473415169693, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Pricing / Rate", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "VCVjV-rpSIjCKnBgW2ETA", + "type": "text", + "x": 618.2553179494373, + "y": -155.7752507343774, + "width": 177.4080891480241, + "height": 32.643010812933404, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aE", + "roundness": null, + "seed": 772187033, + "version": 397, + "versionNonce": 813408601, + "isDeleted": false, + "boundElements": [], + "updated": 1761486677255, + "link": null, + "locked": false, + "text": "Usage/tokens", + "fontSize": 26.11440865034673, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Usage/tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GZ7ewvmytF21pFScjtkyb", + "type": "text", + "x": 611.3675253031425, + "y": -61.087723837098764, + "width": 389.8151569505078, + "height": 36.26862634357106, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aF", + "roundness": null, + "seed": 1121994521, + "version": 300, + "versionNonce": 1828135673, + "isDeleted": false, + "boundElements": [], + "updated": 1761486670857, + "link": null, + "locked": false, + "text": "Cost / acutal incurred cost", + "fontSize": 29.014901074856862, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cost / acutal incurred cost", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YfH_Rb1_snc5Jbi-aNnPl", + "type": "arrow", + "x": 1256.6598301505776, + "y": 200.18702081072516, + "width": 56.67363475604634, + "height": 0.23137679380744203, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aG", + "roundness": { + "type": 2 + }, + "seed": 957119129, + "version": 27, + "versionNonce": 2099830679, + "isDeleted": false, + "boundElements": null, + "updated": 1761486760962, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 56.67363475604634, + 0.23137679380744203 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "al38c4U7sx3F8n8SXIVPp", + "focus": -0.5033107666237708, + "gap": 9.898499618684582 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "AiPZC2ae6DbZ7gaH4xYlL", + "type": "text", + "x": 1325.2168973458563, + "y": 186.0099384558326, + "width": 115.01997375488281, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aH", + "roundness": null, + "seed": 625028183, + "version": 36, + "versionNonce": 1912162841, + "isDeleted": false, + "boundElements": [ + { + "id": "mzhTvv8LY4cGRb4gCTQPw", + "type": "arrow" + } + ], + "updated": 1761487864980, + "link": null, + "locked": false, + "text": "1_000_000", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1_000_000", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "QOHOjM__Wbt0-cbgzTHtM", + "type": "arrow", + "x": 762.0771029964578, + "y": 234.62359517853758, + "width": 265.92830525717113, + "height": 31.628281749459973, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aI", + "roundness": { + "type": 2 + }, + "seed": 216401689, + "version": 58, + "versionNonce": 1767840889, + "isDeleted": false, + "boundElements": null, + "updated": 1761486772442, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 265.92830525717113, + -31.628281749459973 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "YeZdHIjKqqlKlbFZWbPOb", + "focus": -0.7797011681063413, + "gap": 12.272319934716165 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "xdWFIPVf0NwhT5i4EMdcK", + "type": "line", + "x": 929.0377378752594, + "y": 33.83579897958454, + "width": 0, + "height": 998.6682280574096, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aJ", + "roundness": { + "type": 2 + }, + "seed": 134285783, + "version": 163, + "versionNonce": 693284217, + "isDeleted": false, + "boundElements": null, + "updated": 1761488068046, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 998.6682280574096 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "QRursYjkY0ojMQpxx4YVb", + "type": "text", + "x": 1026.4631769695538, + "y": 544.3792701037073, + "width": 161.67984008789062, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aj", + "roundness": null, + "seed": 705785881, + "version": 111, + "versionNonce": 2051946807, + "isDeleted": false, + "boundElements": null, + "updated": 1761487766214, + "link": null, + "locked": false, + "text": "Improve their models", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Improve their models", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5DpYSRbENwG0YkshQ7qtK", + "type": "text", + "x": 1024.062879773086, + "y": 580.4349644656602, + "width": 113.77590942382812, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ak", + "roundness": null, + "seed": 998343383, + "version": 164, + "versionNonce": 1019214423, + "isDeleted": false, + "boundElements": [], + "updated": 1761487766214, + "link": null, + "locked": false, + "text": "Drop the Cost", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Drop the Cost", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "SROrMMHyCA5yDchoI4YiY", + "type": "text", + "x": 1042.6327302025925, + "y": 490.2092566903168, + "width": 111.96778869628906, + "height": 43.70435983659119, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "al", + "roundness": null, + "seed": 612492695, + "version": 664, + "versionNonce": 1227498329, + "isDeleted": false, + "boundElements": null, + "updated": 1761493555751, + "link": null, + "locked": false, + "text": "OpenAI", + "fontSize": 32.37359987895643, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "OpenAI", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "AoVUvPHCibJA82sjp-wbi", + "type": "text", + "x": 1043.9971226050768, + "y": 709.725550569452, + "width": 144.0464630126953, + "height": 43.70435983659119, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "am", + "roundness": null, + "seed": 1350507191, + "version": 705, + "versionNonce": 1318998073, + "isDeleted": false, + "boundElements": null, + "updated": 1761493555751, + "link": null, + "locked": false, + "text": "Anthropic", + "fontSize": 32.37359987895643, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Anthropic", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "Ui-Ekrq4vDf_-dn_6AZtA", + "type": "text", + "x": 1051.6823619780844, + "y": 768.053026664232, + "width": 119.02391052246094, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "an", + "roundness": null, + "seed": 1375629687, + "version": 188, + "versionNonce": 521692599, + "isDeleted": false, + "boundElements": [], + "updated": 1761487766214, + "link": null, + "locked": false, + "text": "Most expensive", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Most expensive", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "G_17CG6OORImW3TTzbECS", + "type": "text", + "x": 1053.5309100415209, + "y": 801.0178008790033, + "width": 119.19989013671875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ao", + "roundness": null, + "seed": 1457079737, + "version": 270, + "versionNonce": 534559865, + "isDeleted": false, + "boundElements": [], + "updated": 1761496370659, + "link": null, + "locked": false, + "text": "Least Discount", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Least Discount", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "M7sHbg8viD417Ni0Tm3w6", + "type": "text", + "x": 1058.4269696154895, + "y": 836.4013242355016, + "width": 99.05589294433594, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ap", + "roundness": null, + "seed": 1751918681, + "version": 314, + "versionNonce": 1109763063, + "isDeleted": false, + "boundElements": [], + "updated": 1761487766214, + "link": null, + "locked": false, + "text": "Rate Limited", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Rate Limited", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "AZM_NmpQMUC0bScZjd9tV", + "type": "text", + "x": 1039.9091959025518, + "y": 963.8635575399629, + "width": 102.61283874511719, + "height": 43.70435983659119, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aq", + "roundness": null, + "seed": 72340025, + "version": 760, + "versionNonce": 1406930199, + "isDeleted": false, + "boundElements": [], + "updated": 1761487766214, + "link": null, + "locked": false, + "text": "Gemini", + "fontSize": 32.37359987895643, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Gemini", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "ho3TbF9CcNEPWj-_0_WPq", + "type": "text", + "x": 1040.8026050060635, + "y": 1023.6648215289588, + "width": 107.51991271972656, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ar", + "roundness": null, + "seed": 170054105, + "version": 275, + "versionNonce": 1898467895, + "isDeleted": false, + "boundElements": [], + "updated": 1761487766214, + "link": null, + "locked": false, + "text": "Kinda in there", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kinda in there", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Y5GfbCgNQTspsIoV0T-pm", + "type": "text", + "x": 1035.2053939309048, + "y": 1057.7405960466563, + "width": 130.12789916992188, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "as", + "roundness": null, + "seed": 1942917143, + "version": 313, + "versionNonce": 1659827031, + "isDeleted": false, + "boundElements": [], + "updated": 1761487766214, + "link": null, + "locked": false, + "text": "corporate pricing", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "corporate pricing", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Ls9_c_vQJtOUABwFzrjeV", + "type": "rectangle", + "x": 1571.158491609844, + "y": 156.76003415998193, + "width": 348.0643350849889, + "height": 582.9269365652766, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "5oVNMjs2bUfx-Z0W7keSV" + ], + "frameId": null, + "index": "asG", + "roundness": { + "type": 3 + }, + "seed": 1067318967, + "version": 83, + "versionNonce": 1909977529, + "isDeleted": false, + "boundElements": [ + { + "id": "mzhTvv8LY4cGRb4gCTQPw", + "type": "arrow" + } + ], + "updated": 1761488344608, + "link": null, + "locked": false + }, + { + "id": "iUOQGeuKR7N_bFJYbJ5tq", + "type": "rectangle", + "x": 1600.38409236927, + "y": 184.44355456059202, + "width": 296.1225622251086, + "height": 94.61383683546308, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "5oVNMjs2bUfx-Z0W7keSV" + ], + "frameId": null, + "index": "asV", + "roundness": { + "type": 3 + }, + "seed": 157305209, + "version": 78, + "versionNonce": 1917818745, + "isDeleted": false, + "boundElements": null, + "updated": 1761488344609, + "link": null, + "locked": false + }, + { + "id": "REWxRQ7vSSG3f3MCRLBGP", + "type": "rectangle", + "x": 1725.1351943749448, + "y": 302.4530359035647, + "width": 177.06528476403008, + "height": 69.9376977924577, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "5oVNMjs2bUfx-Z0W7keSV" + ], + "frameId": null, + "index": "asl", + "roundness": { + "type": 3 + }, + "seed": 1595256151, + "version": 186, + "versionNonce": 2000699481, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "TqQeCPnGTDPZXp2V_8fGG" + } + ], + "updated": 1761488344609, + "link": null, + "locked": false + }, + { + "id": "TqQeCPnGTDPZXp2V_8fGG", + "type": "text", + "x": 1743.635900111452, + "y": 327.42188479979353, + "width": 140.06387329101562, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "5oVNMjs2bUfx-Z0W7keSV" + ], + "frameId": null, + "index": "ast", + "roundness": null, + "seed": 1968045209, + "version": 22, + "versionNonce": 1843973433, + "isDeleted": false, + "boundElements": null, + "updated": 1761488344609, + "link": null, + "locked": false, + "text": "capital of France?", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "REWxRQ7vSSG3f3MCRLBGP", + "originalText": "capital of France?", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "atrUPaof9f9DJyzMiVyWQ", + "type": "rectangle", + "x": 1591.8724036332062, + "y": 391.95606391249567, + "width": 177.06528476403008, + "height": 118.11426935591919, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "5oVNMjs2bUfx-Z0W7keSV" + ], + "frameId": null, + "index": "at", + "roundness": { + "type": 3 + }, + "seed": 930619993, + "version": 259, + "versionNonce": 497860121, + "isDeleted": false, + "boundElements": [], + "updated": 1761488344609, + "link": null, + "locked": false + }, + { + "id": "HDBLGm7Pri0gwIg0dajt6", + "type": "rectangle", + "x": 1722.8522859477766, + "y": 537.8088431025053, + "width": 177.06528476403008, + "height": 50.75378706578624, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "5oVNMjs2bUfx-Z0W7keSV" + ], + "frameId": null, + "index": "atV", + "roundness": { + "type": 3 + }, + "seed": 1996859513, + "version": 312, + "versionNonce": 360682233, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "pNqkn8w7onIKJdyHeQSzh" + } + ], + "updated": 1761488344609, + "link": null, + "locked": false + }, + { + "id": "pNqkn8w7onIKJdyHeQSzh", + "type": "text", + "x": 1756.6649805148502, + "y": 553.1857366353985, + "width": 109.43989562988281, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "5oVNMjs2bUfx-Z0W7keSV" + ], + "frameId": null, + "index": "atd", + "roundness": null, + "seed": 1031670809, + "version": 23, + "versionNonce": 971295705, + "isDeleted": false, + "boundElements": null, + "updated": 1761488344609, + "link": null, + "locked": false, + "text": "3 pargraphs it", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "HDBLGm7Pri0gwIg0dajt6", + "originalText": "3 pargraphs it", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "3MnvRpwkJv4YdfHl6RKfA", + "type": "rectangle", + "x": 1599.779035160395, + "y": 601.4343063101496, + "width": 177.06528476403008, + "height": 118.11426935591919, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "5oVNMjs2bUfx-Z0W7keSV" + ], + "frameId": null, + "index": "au", + "roundness": { + "type": 3 + }, + "seed": 2097951065, + "version": 360, + "versionNonce": 317712569, + "isDeleted": false, + "boundElements": [], + "updated": 1761488344609, + "link": null, + "locked": false + }, + { + "id": "5Tscqor04lnhkuGKpIkIO", + "type": "text", + "x": 1581.648877955338, + "y": 855.3654896009007, + "width": 410.7087571927774, + "height": 81.19947450423537, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "UQ6cqsbSdmn_3LcvCkCst" + ], + "frameId": null, + "index": "av", + "roundness": null, + "seed": 2009722583, + "version": 378, + "versionNonce": 1081536279, + "isDeleted": false, + "boundElements": null, + "updated": 1761489091062, + "link": null, + "locked": false, + "text": "\"Costs millions and millions\nof $$$s\"", + "fontSize": 32.47978980169415, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "\"Costs millions and millions\nof $$$s\"", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "v6bVd5PkRWFbRWdaImK3I", + "type": "text", + "x": 1584.901309734807, + "y": 792.9685489749835, + "width": 188.81266257720486, + "height": 40.148562904258384, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "UQ6cqsbSdmn_3LcvCkCst" + ], + "frameId": null, + "index": "aw", + "roundness": null, + "seed": 678689783, + "version": 455, + "versionNonce": 202830903, + "isDeleted": false, + "boundElements": null, + "updated": 1761489091062, + "link": null, + "locked": false, + "text": "\"Thank you\"", + "fontSize": 32.118850323406726, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "\"Thank you\"", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "JUqOe4PXVfDsozHP_U2qm", + "type": "text", + "x": 1584.483439596067, + "y": 99.06848586562634, + "width": 261.5336508943718, + "height": 44.32777756444821, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ax", + "roundness": null, + "seed": 2084511127, + "version": 106, + "versionNonce": 462442295, + "isDeleted": false, + "boundElements": null, + "updated": 1761487869436, + "link": null, + "locked": false, + "text": "Multi turn chat", + "fontSize": 35.46222205155856, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Multi turn chat", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "mzhTvv8LY4cGRb4gCTQPw", + "type": "arrow", + "x": 1363.860664840881, + "y": 225.68716605848508, + "width": 193.0920909849242, + "height": 96.73983152011769, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ay", + "roundness": { + "type": 2 + }, + "seed": 933171129, + "version": 47, + "versionNonce": 289624729, + "isDeleted": false, + "boundElements": null, + "updated": 1761488344609, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 193.0920909849242, + 96.73983152011769 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "AiPZC2ae6DbZ7gaH4xYlL", + "focus": 0.8867897045521393, + "gap": 14.677227602652493 + }, + "endBinding": { + "elementId": "Ls9_c_vQJtOUABwFzrjeV", + "focus": 0.08317566008878968, + "gap": 26.625654357979556 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "AATX71V5Q8VTwWVaDX4x2", + "type": "text", + "x": 2276.324912277386, + "y": -139.179109068769, + "width": 1282.4447021484375, + "height": 56.85421398234333, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "az", + "roundness": null, + "seed": 1924524727, + "version": 286, + "versionNonce": 737968185, + "isDeleted": false, + "boundElements": null, + "updated": 1761488174383, + "link": null, + "locked": false, + "text": "Output: 281 + 88 = 369 tokens * $10/Mtok = $0.00369", + "fontSize": 45.48337118587467, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Output: 281 + 88 = 369 tokens * $10/Mtok = $0.00369", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "JgPGix3-k3vp3mvRee9Rr", + "type": "text", + "x": 2492.8930953728673, + "y": -214.06244045272805, + "width": 1054.58984375, + "height": 56.85421398234333, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b00", + "roundness": null, + "seed": 2000197655, + "version": 384, + "versionNonce": 992728087, + "isDeleted": false, + "boundElements": [], + "updated": 1761488230839, + "link": null, + "locked": false, + "text": "Input: 13 tokens * $1.25/Mtok = $0.00001625", + "fontSize": 45.48337118587467, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Input: 13 tokens * $1.25/Mtok = $0.00001625", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "G0pE3VyhWFZzjoB7kXfCp", + "type": "line", + "x": 2094.176511115228, + "y": -128.8452987488712, + "width": 0, + "height": 1190.3844250563372, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": { + "type": 2 + }, + "seed": 2022425783, + "version": 85, + "versionNonce": 2055816761, + "isDeleted": false, + "boundElements": null, + "updated": 1761491294780, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 1190.3844250563372 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "j5QNUilYRp0SHkJqXvMzS", + "type": "text", + "x": 3260.5405624448963, + "y": -33.795246165064015, + "width": 306.3077392578125, + "height": 56.85421398234333, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 1770403065, + "version": 465, + "versionNonce": 406162679, + "isDeleted": false, + "boundElements": null, + "updated": 1761489368554, + "link": null, + "locked": false, + "text": "$0.00370625", + "fontSize": 45.48337118587467, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$0.00370625", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "eWZo_5y41furE0cVzRSZh", + "type": "line", + "x": 3052.54929102413, + "y": -59.37935627034676, + "width": 534.5560598199086, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b03", + "roundness": { + "type": 2 + }, + "seed": 75987639, + "version": 25, + "versionNonce": 755466937, + "isDeleted": false, + "boundElements": null, + "updated": 1761488180669, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 534.5560598199086, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "RssV7_zAYj_NCuj3zpEfI", + "type": "line", + "x": 2931.7147134705774, + "y": -274.9696907633999, + "width": 739.5343996257643, + "height": 316.26431730242365, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b04", + "roundness": { + "type": 2 + }, + "seed": 214615353, + "version": 47, + "versionNonce": 817955159, + "isDeleted": false, + "boundElements": null, + "updated": 1761488199182, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 739.5343996257643, + 316.26431730242365 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "YVmkdnSQBoW24gO1ASHG_", + "type": "line", + "x": 3573.190544370378, + "y": -359.6022792296486, + "width": 564.447815528662, + "height": 451.3090411762738, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b05", + "roundness": { + "type": 2 + }, + "seed": 627101369, + "version": 106, + "versionNonce": 2140984825, + "isDeleted": false, + "boundElements": null, + "updated": 1761488197615, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -564.447815528662, + 451.3090411762738 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "bQUMVdiKWixh3Sd2FhbBj", + "type": "line", + "x": 1970.4715584313803, + "y": 109.65601250137763, + "width": 0, + "height": 683.7415690449399, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b07", + "roundness": { + "type": 2 + }, + "seed": 422667703, + "version": 99, + "versionNonce": 357284343, + "isDeleted": false, + "boundElements": null, + "updated": 1761488280696, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 683.7415690449399 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "AhXK7jIcOBWK7nOozv2Oj", + "type": "text", + "x": 342.1626503690975, + "y": 1182.4032190989699, + "width": 1175.7447509765625, + "height": 84.09027822970508, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b08", + "roundness": null, + "seed": 1998950393, + "version": 336, + "versionNonce": 1325976185, + "isDeleted": false, + "boundElements": [], + "updated": 1761488387972, + "link": null, + "locked": false, + "text": "How do these providers charge you?", + "fontSize": 67.27222258376406, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "How do these providers charge you?", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Euhoa0xcIQ70JNuuetfF1", + "type": "rectangle", + "x": -273.04755943302655, + "y": 1287.3603839238835, + "width": 348.0643350849889, + "height": 582.9269365652766, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zL67emk9EXpepzjeD0j_b" + ], + "frameId": null, + "index": "b09", + "roundness": { + "type": 3 + }, + "seed": 2055303991, + "version": 259, + "versionNonce": 2129379257, + "isDeleted": false, + "boundElements": null, + "updated": 1761488945038, + "link": null, + "locked": false + }, + { + "id": "x98S8hJAM8wHb9GGVqRjZ", + "type": "rectangle", + "x": -243.82195867360053, + "y": 1315.0439043244937, + "width": 296.1225622251086, + "height": 94.61383683546308, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zL67emk9EXpepzjeD0j_b" + ], + "frameId": null, + "index": "b0A", + "roundness": { + "type": 3 + }, + "seed": 108786775, + "version": 254, + "versionNonce": 648896665, + "isDeleted": false, + "boundElements": null, + "updated": 1761488945038, + "link": null, + "locked": false + }, + { + "id": "dv77BD7vyWm0uejkFxSTh", + "type": "rectangle", + "x": -119.07085666792602, + "y": 1433.0533856674663, + "width": 177.06528476403008, + "height": 69.9376977924577, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zL67emk9EXpepzjeD0j_b" + ], + "frameId": null, + "index": "b0B", + "roundness": { + "type": 3 + }, + "seed": 1841910135, + "version": 368, + "versionNonce": 452900599, + "isDeleted": false, + "boundElements": [ + { + "id": "9xeV75U4siCYZCwYs24eD", + "type": "text" + } + ], + "updated": 1761488945038, + "link": null, + "locked": false + }, + { + "id": "9xeV75U4siCYZCwYs24eD", + "type": "text", + "x": -100.57015093141888, + "y": 1458.0222345636953, + "width": 140.06387329101562, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zL67emk9EXpepzjeD0j_b" + ], + "frameId": null, + "index": "b0C", + "roundness": null, + "seed": 2041449111, + "version": 202, + "versionNonce": 626790969, + "isDeleted": false, + "boundElements": null, + "updated": 1761488945038, + "link": null, + "locked": false, + "text": "capital of France?", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "dv77BD7vyWm0uejkFxSTh", + "originalText": "capital of France?", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "SmiP7YLcjd2-L7KxIgCCZ", + "type": "rectangle", + "x": -252.3336474096642, + "y": 1522.5564136763974, + "width": 177.06528476403008, + "height": 118.11426935591919, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zL67emk9EXpepzjeD0j_b" + ], + "frameId": null, + "index": "b0D", + "roundness": { + "type": 3 + }, + "seed": 1457430455, + "version": 435, + "versionNonce": 61184825, + "isDeleted": false, + "boundElements": null, + "updated": 1761488945038, + "link": null, + "locked": false + }, + { + "id": "y9xZBBfKspAi9Szll4Z0o", + "type": "rectangle", + "x": -121.35376509509399, + "y": 1668.409192866407, + "width": 177.06528476403008, + "height": 50.75378706578624, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zL67emk9EXpepzjeD0j_b" + ], + "frameId": null, + "index": "b0E", + "roundness": { + "type": 3 + }, + "seed": 662671575, + "version": 494, + "versionNonce": 581277689, + "isDeleted": false, + "boundElements": [ + { + "id": "3cnb4rAaqGmQxuHjR-kms", + "type": "text" + } + ], + "updated": 1761488945038, + "link": null, + "locked": false + }, + { + "id": "3cnb4rAaqGmQxuHjR-kms", + "type": "text", + "x": -87.54107052802044, + "y": 1683.7860863993, + "width": 109.43989562988281, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zL67emk9EXpepzjeD0j_b" + ], + "frameId": null, + "index": "b0F", + "roundness": null, + "seed": 1428512247, + "version": 203, + "versionNonce": 1886348057, + "isDeleted": false, + "boundElements": null, + "updated": 1761488945038, + "link": null, + "locked": false, + "text": "3 pargraphs it", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "y9xZBBfKspAi9Szll4Z0o", + "originalText": "3 pargraphs it", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "vtnnxgv9t6DJQ9eRP9LDu", + "type": "rectangle", + "x": -244.42701588247576, + "y": 1732.0346560740513, + "width": 177.06528476403008, + "height": 118.11426935591919, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zL67emk9EXpepzjeD0j_b" + ], + "frameId": null, + "index": "b0G", + "roundness": { + "type": 3 + }, + "seed": 584353559, + "version": 536, + "versionNonce": 132930009, + "isDeleted": false, + "boundElements": null, + "updated": 1761488945038, + "link": null, + "locked": false + }, + { + "id": "RSriuUXi2YRWLlH3hPS1j", + "type": "line", + "x": 185.65029333511347, + "y": 1174.205954382633, + "width": 5.684341886080802e-14, + "height": 977.2715807579407, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": { + "type": 2 + }, + "seed": 1741825047, + "version": 41, + "versionNonce": 912779191, + "isDeleted": false, + "boundElements": null, + "updated": 1761488354226, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -5.684341886080802e-14, + 977.2715807579407 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "098kiN7XFVoP2EGgXJEJd", + "type": "rectangle", + "x": 325.93150759589446, + "y": 1390.5455104355099, + "width": 348.0643350849889, + "height": 582.9269365652766, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "K44Az6bnqS4h9Nbe1RXs3" + ], + "frameId": null, + "index": "b0I", + "roundness": { + "type": 3 + }, + "seed": 1368735095, + "version": 317, + "versionNonce": 215754743, + "isDeleted": false, + "boundElements": [ + { + "id": "rTsiU1wCMkWCdF6uJ7xLI", + "type": "arrow" + } + ], + "updated": 1761488749123, + "link": null, + "locked": false + }, + { + "id": "Gs9Op3cqFA5PMwE7f4ctf", + "type": "rectangle", + "x": 355.2768157709561, + "y": 1418.080586456491, + "width": 296.1225622251086, + "height": 94.61383683546308, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "K44Az6bnqS4h9Nbe1RXs3" + ], + "frameId": null, + "index": "b0J", + "roundness": { + "type": 3 + }, + "seed": 1427928727, + "version": 314, + "versionNonce": 1745421975, + "isDeleted": false, + "boundElements": [ + { + "id": "P3qxVWDV1JQTaWOqrDviw", + "type": "arrow" + }, + { + "type": "text", + "id": "QvTPKPcN_8EtlNuxLggYO" + } + ], + "updated": 1761488750696, + "link": null, + "locked": false + }, + { + "id": "QvTPKPcN_8EtlNuxLggYO", + "type": "text", + "x": 446.7701494958151, + "y": 1455.3875048742225, + "width": 113.13589477539062, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [ + "K44Az6bnqS4h9Nbe1RXs3" + ], + "frameId": null, + "index": "b0JV", + "roundness": null, + "seed": 926099833, + "version": 15, + "versionNonce": 1057510041, + "isDeleted": false, + "boundElements": null, + "updated": 1761488752971, + "link": null, + "locked": false, + "text": "system prompt", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Gs9Op3cqFA5PMwE7f4ctf", + "originalText": "system prompt", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "NURzwAOKdpOsD_kHBFKOh", + "type": "rectangle", + "x": 479.908210360995, + "y": 1536.2385121790924, + "width": 177.06528476403008, + "height": 69.9376977924577, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "K44Az6bnqS4h9Nbe1RXs3" + ], + "frameId": null, + "index": "b0K", + "roundness": { + "type": 3 + }, + "seed": 295668663, + "version": 421, + "versionNonce": 718861431, + "isDeleted": false, + "boundElements": [ + { + "id": "Av4KDpvrfMdo8tEt7qJQP", + "type": "text" + }, + { + "id": "bCFahqxa28aHWz4Sq87tT", + "type": "arrow" + } + ], + "updated": 1761488749123, + "link": null, + "locked": false + }, + { + "id": "Av4KDpvrfMdo8tEt7qJQP", + "type": "text", + "x": 498.40891609750224, + "y": 1561.2073610753212, + "width": 140.06387329101562, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "K44Az6bnqS4h9Nbe1RXs3" + ], + "frameId": null, + "index": "b0L", + "roundness": null, + "seed": 860028119, + "version": 257, + "versionNonce": 1523666327, + "isDeleted": false, + "boundElements": null, + "updated": 1761488749123, + "link": null, + "locked": false, + "text": "capital of France?", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "NURzwAOKdpOsD_kHBFKOh", + "originalText": "capital of France?", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rTsiU1wCMkWCdF6uJ7xLI", + "type": "arrow", + "x": 674.3812670967154, + "y": 1409.6277665296334, + "width": 292.78539037604094, + "height": 17.666220547187322, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Q", + "roundness": { + "type": 2 + }, + "seed": 771370393, + "version": 100, + "versionNonce": 220336407, + "isDeleted": false, + "boundElements": null, + "updated": 1761488749123, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 292.78539037604094, + -17.666220547187322 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "098kiN7XFVoP2EGgXJEJd", + "focus": -0.8671827257440233, + "gap": 2.7824358955350776 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "AcfmAHXg23jD2Ok4-EME5", + "type": "text", + "x": 983.7432572729808, + "y": 1365.7947280478343, + "width": 143.5908137069048, + "height": 39.22392010093498, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0R", + "roundness": null, + "seed": 1672655959, + "version": 164, + "versionNonce": 1375245271, + "isDeleted": false, + "boundElements": [ + { + "id": "euP32uwZsOMmO0cMxkDSj", + "type": "arrow" + } + ], + "updated": 1761488590653, + "link": null, + "locked": false, + "text": "Providers", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Providers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "KE7QUQZOoFL6CF6TohP1O", + "type": "text", + "x": 1592.8542629802334, + "y": 1182.8275190533286, + "width": 315.80169677734375, + "height": 80.29712580851681, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "32AGmZ1z4mlBuQeZS4YNV" + ], + "frameId": null, + "index": "b0T", + "roundness": null, + "seed": 1761708889, + "version": 654, + "versionNonce": 839841335, + "isDeleted": false, + "boundElements": [], + "updated": 1761488453208, + "link": null, + "locked": false, + "text": "Input: $1.5/token \nOutputs: $10/token", + "fontSize": 32.118850323406726, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Input: $1.5/token \nOutputs: $10/token", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "P3qxVWDV1JQTaWOqrDviw", + "type": "arrow", + "x": 652.3506706105594, + "y": 1471.5317061270437, + "width": 102.75279258794637, + "height": 0.8904052161626623, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0U", + "roundness": { + "type": 2 + }, + "seed": 1430946521, + "version": 79, + "versionNonce": 489990009, + "isDeleted": false, + "boundElements": null, + "updated": 1761488781255, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 102.75279258794637, + -0.8904052161626623 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "Gs9Op3cqFA5PMwE7f4ctf", + "focus": 0.15302489115079287, + "gap": 1 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "rP6829CrjH94rW9pmiJ3T", + "type": "text", + "x": 767.721163818864, + "y": 1450.8855459688689, + "width": 150.04266357421875, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0V", + "roundness": null, + "seed": 1366937177, + "version": 166, + "versionNonce": 583359801, + "isDeleted": false, + "boundElements": [], + "updated": 1761488854031, + "link": null, + "locked": false, + "text": "10 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "10 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "fw7eeEHtH2GuZ0aCyAODH", + "type": "text", + "x": 763.3868540266704, + "y": 1559.3900997560347, + "width": 134.16943359375, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0W", + "roundness": null, + "seed": 1409038711, + "version": 142, + "versionNonce": 258945849, + "isDeleted": false, + "boundElements": [ + { + "id": "bCFahqxa28aHWz4Sq87tT", + "type": "arrow" + } + ], + "updated": 1761488489128, + "link": null, + "locked": false, + "text": "4 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "4 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "bCFahqxa28aHWz4Sq87tT", + "type": "arrow", + "x": 658.2748833824519, + "y": 1576.571774125622, + "width": 102.80396189376063, + "height": 0.15774180128164517, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0X", + "roundness": { + "type": 2 + }, + "seed": 1027502137, + "version": 54, + "versionNonce": 1321852217, + "isDeleted": false, + "boundElements": null, + "updated": 1761488781255, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 102.80396189376063, + 0.15774180128164517 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "NURzwAOKdpOsD_kHBFKOh", + "focus": 0.1488852859583825, + "gap": 1.3013882574268791 + }, + "endBinding": { + "elementId": "fw7eeEHtH2GuZ0aCyAODH", + "focus": 0.10986962626568625, + "gap": 2.3080087504579296 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "6L9hh8Kg9iksQs9Vt3fex", + "type": "line", + "x": 723.8847925716293, + "y": 1633.403531652135, + "width": 217.8616343911275, + "height": 3.5666435093289692, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Y", + "roundness": { + "type": 2 + }, + "seed": 1245315705, + "version": 91, + "versionNonce": 766629401, + "isDeleted": false, + "boundElements": null, + "updated": 1761488651290, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 217.8616343911275, + -3.5666435093289692 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "GD3JUyEcsP3vMOtUMm2iV", + "type": "text", + "x": 763.2896391887209, + "y": 1643.5365654098646, + "width": 147.56442260742188, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#6741d9", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Z", + "roundness": null, + "seed": 1728495577, + "version": 233, + "versionNonce": 2071363927, + "isDeleted": false, + "boundElements": [ + { + "id": "bCFahqxa28aHWz4Sq87tT", + "type": "arrow" + } + ], + "updated": 1761488531749, + "link": null, + "locked": false, + "text": "14 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "14 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Bl66ZSqR4sAiGM1v3Afpy", + "type": "text", + "x": 757.5527332935319, + "y": 1697.742496522023, + "width": 215.95098876953125, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#6741d9", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0a", + "roundness": null, + "seed": 1593767831, + "version": 285, + "versionNonce": 1312764249, + "isDeleted": false, + "boundElements": null, + "updated": 1761488910372, + "link": null, + "locked": false, + "text": "x $1.5/tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x $1.5/tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "OGcIHEeod-aVQbVcxivqA", + "type": "text", + "x": 785.898555735615, + "y": 1777.495253121216, + "width": 57.97175598144531, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0b", + "roundness": null, + "seed": 707202841, + "version": 404, + "versionNonce": 1786748599, + "isDeleted": false, + "boundElements": [], + "updated": 1761488566792, + "link": null, + "locked": false, + "text": "$21", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$21", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Ki0xhrOFVEH6DqJWx1NRv", + "type": "line", + "x": 724.0030044787729, + "y": 1762.2279552993916, + "width": 217.8616343911275, + "height": 3.5666435093289692, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0c", + "roundness": { + "type": 2 + }, + "seed": 1092533977, + "version": 144, + "versionNonce": 1601617561, + "isDeleted": false, + "boundElements": null, + "updated": 1761488562121, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 217.8616343911275, + -3.5666435093289692 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "euP32uwZsOMmO0cMxkDSj", + "type": "arrow", + "x": 1111.91102752977, + "y": 1418.7468653657036, + "width": 151.7629637205498, + "height": 33.66749233986366, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0d", + "roundness": { + "type": 2 + }, + "seed": 696378903, + "version": 60, + "versionNonce": 1815201497, + "isDeleted": false, + "boundElements": null, + "updated": 1761488592915, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 151.7629637205498, + 33.66749233986366 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "AcfmAHXg23jD2Ok4-EME5", + "focus": 0.5862360734574522, + "gap": 13.728217216934354 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "U1laKnw1W_4DxFxUk7kuw", + "type": "rectangle", + "x": 1304.4386450144184, + "y": 1372.2733978282827, + "width": 348.0643350849889, + "height": 582.9269365652766, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "pZXmgyaTAam2babDYzIZv" + ], + "frameId": null, + "index": "b0e", + "roundness": { + "type": 3 + }, + "seed": 1281615095, + "version": 354, + "versionNonce": 826795129, + "isDeleted": false, + "boundElements": [], + "updated": 1761488627587, + "link": null, + "locked": false + }, + { + "id": "GtEzRr06mwgjJFD6y_Mu7", + "type": "rectangle", + "x": 1333.6642457738444, + "y": 1399.9569182288928, + "width": 296.1225622251086, + "height": 94.61383683546308, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "pZXmgyaTAam2babDYzIZv" + ], + "frameId": null, + "index": "b0f", + "roundness": { + "type": 3 + }, + "seed": 1588211223, + "version": 349, + "versionNonce": 732360025, + "isDeleted": false, + "boundElements": [], + "updated": 1761488627587, + "link": null, + "locked": false + }, + { + "id": "gBRt17JLirDCQyiODAALy", + "type": "rectangle", + "x": 1458.415347779519, + "y": 1517.9663995718654, + "width": 177.06528476403008, + "height": 69.9376977924577, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "pZXmgyaTAam2babDYzIZv" + ], + "frameId": null, + "index": "b0g", + "roundness": { + "type": 3 + }, + "seed": 529158967, + "version": 457, + "versionNonce": 452057657, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ZICRPtY2GtdNUooFVIVxc" + } + ], + "updated": 1761488627587, + "link": null, + "locked": false + }, + { + "id": "ZICRPtY2GtdNUooFVIVxc", + "type": "text", + "x": 1476.9160535160258, + "y": 1542.9352484680944, + "width": 140.06387329101562, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "pZXmgyaTAam2babDYzIZv" + ], + "frameId": null, + "index": "b0h", + "roundness": null, + "seed": 1466487895, + "version": 294, + "versionNonce": 1074539289, + "isDeleted": false, + "boundElements": [], + "updated": 1761488627587, + "link": null, + "locked": false, + "text": "capital of France?", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "gBRt17JLirDCQyiODAALy", + "originalText": "capital of France?", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "BvgIXAaq4ShsFWdUbtm7l", + "type": "rectangle", + "x": 1325.1525570377808, + "y": 1607.4694275807965, + "width": 177.06528476403008, + "height": 118.11426935591919, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "pZXmgyaTAam2babDYzIZv" + ], + "frameId": null, + "index": "b0i", + "roundness": { + "type": 3 + }, + "seed": 1310339447, + "version": 531, + "versionNonce": 642547161, + "isDeleted": false, + "boundElements": [ + { + "id": "_XGzQfqSt_qCCj0pmxTqC", + "type": "arrow" + } + ], + "updated": 1761488635559, + "link": null, + "locked": false + }, + { + "id": "5ugST3e0n3EkVnMC5h-sk", + "type": "line", + "x": 320.1968794875132, + "y": 1615.4765203811144, + "width": 362.6273369967403, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0m", + "roundness": { + "type": 2 + }, + "seed": 1282134713, + "version": 81, + "versionNonce": 1185443415, + "isDeleted": false, + "boundElements": null, + "updated": 1761488612309, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 362.6273369967403, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "QcVGesFn2K1EQHhcgmBCh", + "type": "line", + "x": 1286.5979620765474, + "y": 1596.9060921791431, + "width": 418.7918806483965, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0r", + "roundness": { + "type": 2 + }, + "seed": 243059831, + "version": 73, + "versionNonce": 2039447225, + "isDeleted": false, + "boundElements": null, + "updated": 1761488626880, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 418.7918806483965, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "_XGzQfqSt_qCCj0pmxTqC", + "type": "arrow", + "x": 1510.7449899197227, + "y": 1656.6197541466727, + "width": 239.09107128826008, + "height": 2.538206693383472, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0s", + "roundness": { + "type": 2 + }, + "seed": 1888122297, + "version": 44, + "versionNonce": 1366656249, + "isDeleted": false, + "boundElements": null, + "updated": 1761488635559, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 239.09107128826008, + 2.538206693383472 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "BvgIXAaq4ShsFWdUbtm7l", + "focus": -0.1822957936485741, + "gap": 8.527148117911793 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Qg9hi4DlSqa4nh4oQEGI9", + "type": "text", + "x": 1765.3854039407092, + "y": 1639.0279631374813, + "width": 150.04266357421875, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0t", + "roundness": null, + "seed": 1128994039, + "version": 239, + "versionNonce": 1598774233, + "isDeleted": false, + "boundElements": null, + "updated": 1761488858940, + "link": null, + "locked": false, + "text": "10 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "10 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "41ahGDhwxRiHYmzm1XEHH", + "type": "line", + "x": 1740.2321935742134, + "y": 1693.5518819904223, + "width": 217.8616343911275, + "height": 3.5666435093289692, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0u", + "roundness": { + "type": 2 + }, + "seed": 2038682455, + "version": 162, + "versionNonce": 802615705, + "isDeleted": false, + "boundElements": null, + "updated": 1761488666422, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 217.8616343911275, + -3.5666435093289692 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "uoG0CWmnVrO7UjUst1189", + "type": "text", + "x": 1756.7333987304849, + "y": 1717.9276391929027, + "width": 191.76473999023438, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0v", + "roundness": null, + "seed": 1091516567, + "version": 293, + "versionNonce": 11517271, + "isDeleted": false, + "boundElements": null, + "updated": 1761488994262, + "link": null, + "locked": false, + "text": "x $10/token", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x $10/token", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "z8ACVkDbwGhRXfvGKWfJL", + "type": "line", + "x": 1740.2321935742134, + "y": 1774.461176765632, + "width": 217.8616343911275, + "height": 3.5666435093289692, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0w", + "roundness": { + "type": 2 + }, + "seed": 763618265, + "version": 214, + "versionNonce": 91812599, + "isDeleted": false, + "boundElements": [], + "updated": 1761488667056, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 217.8616343911275, + -3.5666435093289692 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "-fdNSOhGyLVNLMAXTuZg8", + "type": "text", + "x": 1799.0725913268595, + "y": 1798.8057063362237, + "width": 77.672119140625, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0x", + "roundness": null, + "seed": 1233305721, + "version": 364, + "versionNonce": 1620834935, + "isDeleted": false, + "boundElements": [], + "updated": 1761488994262, + "link": null, + "locked": false, + "text": "$100", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$100", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9hX1Q5JEU5jBCNaI_4t49", + "type": "line", + "x": 1787.6540069620355, + "y": 2939.4455629240983, + "width": 1674.8940663961503, + "height": 11.496620310256276, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0y", + "roundness": { + "type": 2 + }, + "seed": 728020503, + "version": 327, + "versionNonce": 13260441, + "isDeleted": false, + "boundElements": null, + "updated": 1761489026419, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1674.8940663961503, + 11.496620310256276 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "ivs8SrWCjQ2RdI2SF9i5c", + "type": "arrow", + "x": 817.13025813941, + "y": 1844.331878298982, + "width": 235.28037246441795, + "height": 366.05186381029057, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b10", + "roundness": { + "type": 2 + }, + "seed": 121447031, + "version": 110, + "versionNonce": 2101362135, + "isDeleted": false, + "boundElements": null, + "updated": 1761488713634, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 235.28037246441795, + 366.05186381029057 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "tCi4Xx62N0qY7CUgQOzML", + "type": "arrow", + "x": 1847.036017576415, + "y": 1864.5149859359976, + "width": 612.1127716792189, + "height": 358.87151049469685, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b11", + "roundness": { + "type": 2 + }, + "seed": 1261852823, + "version": 105, + "versionNonce": 1297735577, + "isDeleted": false, + "boundElements": null, + "updated": 1761488715385, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -612.1127716792189, + 358.87151049469685 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "1KYXzWXc2WDrWoMckUd-t", + "type": "text", + "x": 1080.817907317095, + "y": 2229.3562223074964, + "width": 123.00654812114185, + "height": 67.60570368910038, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b12", + "roundness": null, + "seed": 860302007, + "version": 472, + "versionNonce": 1039037623, + "isDeleted": false, + "boundElements": [ + { + "id": "ON8MSIGxajLGYTsCqjnyN", + "type": "arrow" + } + ], + "updated": 1761489052006, + "link": null, + "locked": false, + "text": "$121", + "fontSize": 54.08456295128031, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$121", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "fQbkvxi_e6IhvYb5b5gAl", + "type": "rectangle", + "x": 1741.0482227822115, + "y": 2200.871930471211, + "width": 348.0643350849889, + "height": 582.9269365652766, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tAw20jSN0kJoG4Oz-yAT4" + ], + "frameId": null, + "index": "b13", + "roundness": { + "type": 3 + }, + "seed": 1226622967, + "version": 372, + "versionNonce": 1010908985, + "isDeleted": false, + "boundElements": [ + { + "id": "RUlSGEmSA8L6QTrATyUsV", + "type": "arrow" + } + ], + "updated": 1761488967428, + "link": null, + "locked": false + }, + { + "id": "cT-1wPkbVD9JITi5xwbqD", + "type": "rectangle", + "x": 1770.2738235416375, + "y": 2228.555450871821, + "width": 296.1225622251086, + "height": 94.61383683546308, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tAw20jSN0kJoG4Oz-yAT4" + ], + "frameId": null, + "index": "b14", + "roundness": { + "type": 3 + }, + "seed": 944681239, + "version": 365, + "versionNonce": 1040306137, + "isDeleted": false, + "boundElements": null, + "updated": 1761488967428, + "link": null, + "locked": false + }, + { + "id": "jx7EuF4ve4JcsLB_CXWX6", + "type": "rectangle", + "x": 1895.024925547312, + "y": 2346.5649322147938, + "width": 177.06528476403008, + "height": 69.9376977924577, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tAw20jSN0kJoG4Oz-yAT4" + ], + "frameId": null, + "index": "b15", + "roundness": { + "type": 3 + }, + "seed": 2007397943, + "version": 477, + "versionNonce": 316681431, + "isDeleted": false, + "boundElements": [ + { + "id": "2qd2CLLALzlwyfbE5W0lF", + "type": "text" + } + ], + "updated": 1761488967428, + "link": null, + "locked": false + }, + { + "id": "2qd2CLLALzlwyfbE5W0lF", + "type": "text", + "x": 1913.525631283819, + "y": 2371.5337811110226, + "width": 140.06387329101562, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tAw20jSN0kJoG4Oz-yAT4" + ], + "frameId": null, + "index": "b16", + "roundness": null, + "seed": 1040750423, + "version": 312, + "versionNonce": 1275760727, + "isDeleted": false, + "boundElements": null, + "updated": 1761488967428, + "link": null, + "locked": false, + "text": "capital of France?", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "jx7EuF4ve4JcsLB_CXWX6", + "originalText": "capital of France?", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YuHnqb8I-z-vCaCGraopX", + "type": "rectangle", + "x": 1761.7621348055739, + "y": 2436.0679602237246, + "width": 177.06528476403008, + "height": 118.11426935591919, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tAw20jSN0kJoG4Oz-yAT4" + ], + "frameId": null, + "index": "b17", + "roundness": { + "type": 3 + }, + "seed": 1909036151, + "version": 548, + "versionNonce": 740749337, + "isDeleted": false, + "boundElements": [ + { + "id": "vhHPRWoYbwfrsVQtR3sBC", + "type": "arrow" + } + ], + "updated": 1761488967428, + "link": null, + "locked": false + }, + { + "id": "rI603qnItXv1iq4oRnrk0", + "type": "rectangle", + "x": 1892.742017120144, + "y": 2581.9207394137343, + "width": 177.06528476403008, + "height": 50.75378706578624, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tAw20jSN0kJoG4Oz-yAT4" + ], + "frameId": null, + "index": "b18", + "roundness": { + "type": 3 + }, + "seed": 984477079, + "version": 603, + "versionNonce": 1108507127, + "isDeleted": false, + "boundElements": [ + { + "id": "Ql5YSa9Cq9szb-EN0PYz-", + "type": "text" + } + ], + "updated": 1761488967428, + "link": null, + "locked": false + }, + { + "id": "Ql5YSa9Cq9szb-EN0PYz-", + "type": "text", + "x": 1926.5547116872174, + "y": 2597.2976329466273, + "width": 109.43989562988281, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tAw20jSN0kJoG4Oz-yAT4" + ], + "frameId": null, + "index": "b19", + "roundness": null, + "seed": 1407853239, + "version": 313, + "versionNonce": 1059351927, + "isDeleted": false, + "boundElements": null, + "updated": 1761488967428, + "link": null, + "locked": false, + "text": "3 pargraphs it", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "rI603qnItXv1iq4oRnrk0", + "originalText": "3 pargraphs it", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "3oaHOlDWtkwFFMXiIqsoD", + "type": "arrow", + "x": 2076.567282755072, + "y": 2274.6241010458234, + "width": 102.75279258794637, + "height": 0.8904052161626623, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1B", + "roundness": { + "type": 2 + }, + "seed": 1270819383, + "version": 193, + "versionNonce": 487973207, + "isDeleted": false, + "boundElements": [], + "updated": 1761488788594, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 102.75279258794637, + -0.8904052161626623 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "0B3_0-vnZACbncoRqDGRb", + "type": "text", + "x": 2191.8318505724033, + "y": 2254.1010480144646, + "width": 150.04266357421875, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1C", + "roundness": null, + "seed": 2011992407, + "version": 285, + "versionNonce": 937497497, + "isDeleted": false, + "boundElements": null, + "updated": 1761488824736, + "link": null, + "locked": false, + "text": "10 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "10 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "oWdMS2vTo1UqgkIfeC966", + "type": "text", + "x": 2187.503788860052, + "y": 2362.3529913575403, + "width": 134.16943359375, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1D", + "roundness": null, + "seed": 1510455961, + "version": 263, + "versionNonce": 30794393, + "isDeleted": false, + "boundElements": [ + { + "id": "D6AaazYSLpv_bppcAlE0I", + "type": "arrow" + } + ], + "updated": 1761488852465, + "link": null, + "locked": false, + "text": "4 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "4 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "D6AaazYSLpv_bppcAlE0I", + "type": "arrow", + "x": 2082.4914955269646, + "y": 2379.6814091735137, + "width": 102.7042845826295, + "height": 0.1576766269390646, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1E", + "roundness": { + "type": 2 + }, + "seed": 1984364409, + "version": 294, + "versionNonce": 1376790393, + "isDeleted": false, + "boundElements": null, + "updated": 1761488852465, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 102.7042845826295, + 0.1576766269390646 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "oWdMS2vTo1UqgkIfeC966", + "focus": 0.1024263479483746, + "gap": 2.308008750458157 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "vhHPRWoYbwfrsVQtR3sBC", + "type": "arrow", + "x": 1939.633524281492, + "y": 2491.7725434033964, + "width": 245.66193313923316, + "height": 6.124892418282343, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1F", + "roundness": { + "type": 2 + }, + "seed": 496181655, + "version": 426, + "versionNonce": 96242041, + "isDeleted": false, + "boundElements": [], + "updated": 1761488967428, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 245.66193313923316, + -6.124892418282343 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "YuHnqb8I-z-vCaCGraopX", + "focus": -0.018355385379979272, + "gap": 1 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "KXvL9ubWWgiaZo4XTgV-u", + "type": "text", + "x": 2202.136024830036, + "y": 2469.892425588286, + "width": 150.04266357421875, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1G", + "roundness": null, + "seed": 1961544535, + "version": 379, + "versionNonce": 1232926745, + "isDeleted": false, + "boundElements": [], + "updated": 1761488807406, + "link": null, + "locked": false, + "text": "10 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "10 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1pE8YCJCiuFuFvXqaer1Z", + "type": "text", + "x": 2187.6034661711833, + "y": 2589.406867736823, + "width": 134.8909454345703, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1H", + "roundness": null, + "seed": 1984252023, + "version": 290, + "versionNonce": 1279522999, + "isDeleted": false, + "boundElements": [ + { + "id": "tZ89ZvNAIsjEualabMKvZ", + "type": "arrow" + } + ], + "updated": 1761488814315, + "link": null, + "locked": false, + "text": "3 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "3 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "tZ89ZvNAIsjEualabMKvZ", + "type": "arrow", + "x": 2082.4914955269646, + "y": 2606.7352855527965, + "width": 102.80396189376052, + "height": 0.1573922357988522, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1I", + "roundness": { + "type": 2 + }, + "seed": 797865687, + "version": 349, + "versionNonce": 1490143703, + "isDeleted": false, + "boundElements": null, + "updated": 1761488814315, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 102.80396189376052, + 0.1573922357988522 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "1pE8YCJCiuFuFvXqaer1Z", + "focus": 0.10242634794839774, + "gap": 2.308008750458157 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "rS3hoFEVua4D7D6eiOs6I", + "type": "line", + "x": 2146.385903918757, + "y": 2652.5339665442148, + "width": 316.82986571106903, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1J", + "roundness": { + "type": 2 + }, + "seed": 1303150615, + "version": 42, + "versionNonce": 286311351, + "isDeleted": false, + "boundElements": null, + "updated": 1761488819772, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 316.82986571106903, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "q-1HJT8DUskm09k2rKccr", + "type": "text", + "x": 2198.269659385061, + "y": 2672.070422924439, + "width": 155.2814483642578, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#6741d9", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1K", + "roundness": null, + "seed": 98220407, + "version": 389, + "versionNonce": 676484023, + "isDeleted": false, + "boundElements": null, + "updated": 1761488873444, + "link": null, + "locked": false, + "text": "27 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "27 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "HXZvIG7VPa3iwLB38G0D0", + "type": "text", + "x": 2201.3468063215564, + "y": 2730.4366139700496, + "width": 215.95098876953125, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#6741d9", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1L", + "roundness": null, + "seed": 1158386681, + "version": 411, + "versionNonce": 304251927, + "isDeleted": false, + "boundElements": null, + "updated": 1761488920677, + "link": null, + "locked": false, + "text": "x $1.5/tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x $1.5/tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "i-H8jPIPZ8kBUhtelLAYe", + "type": "text", + "x": 2233.3792960736578, + "y": 2829.831421623797, + "width": 61.79888916015625, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#6741d9", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1M", + "roundness": null, + "seed": 1915857431, + "version": 500, + "versionNonce": 1084564855, + "isDeleted": false, + "boundElements": null, + "updated": 1761488928056, + "link": null, + "locked": false, + "text": "$40", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$40", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "pB0DaS1FDtWJSssEXirTb", + "type": "line", + "x": 2141.911283324318, + "y": 2807.4342487959066, + "width": 316.82986571106903, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1N", + "roundness": { + "type": 2 + }, + "seed": 1243309273, + "version": 63, + "versionNonce": 1312455319, + "isDeleted": false, + "boundElements": [], + "updated": 1761488926623, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 316.82986571106903, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "RUlSGEmSA8L6QTrATyUsV", + "type": "arrow", + "x": 2094.0661891336304, + "y": 2219.1835135008923, + "width": 332.81380848743356, + "height": 57.276410293085064, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1O", + "roundness": { + "type": 2 + }, + "seed": 466973623, + "version": 64, + "versionNonce": 876540505, + "isDeleted": false, + "boundElements": null, + "updated": 1761488967428, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 332.81380848743356, + -57.276410293085064 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "fQbkvxi_e6IhvYb5b5gAl", + "focus": -0.7539955327499094, + "gap": 9.989434371959595 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "XcnSsX5Z9fwrxyW0UTkS_", + "type": "text", + "x": 2450.7413567525437, + "y": 2148.0105089440744, + "width": 113.57996348726967, + "height": 35.20333631173328, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1P", + "roundness": null, + "seed": 389551705, + "version": 40, + "versionNonce": 1078568697, + "isDeleted": false, + "boundElements": [ + { + "id": "Rw9JIfOWW5OzgCIEbmrcQ", + "type": "arrow" + } + ], + "updated": 1761488951530, + "link": null, + "locked": false, + "text": "Provider", + "fontSize": 28.162669049386615, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Provider", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9_fKo6pGAC-H2Bwbfznip", + "type": "rectangle", + "x": 2775.575369712773, + "y": 2186.0614201353537, + "width": 348.0643350849889, + "height": 582.9269365652766, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Pr3_2dxpIUbCeEVs8J6eC" + ], + "frameId": null, + "index": "b1Q", + "roundness": { + "type": 3 + }, + "seed": 1805844729, + "version": 365, + "versionNonce": 1839482425, + "isDeleted": false, + "boundElements": null, + "updated": 1761488951985, + "link": null, + "locked": false + }, + { + "id": "C4SuxeV8QPP4ht4f9cZZt", + "type": "rectangle", + "x": 2804.800970472199, + "y": 2213.744940535964, + "width": 296.1225622251086, + "height": 94.61383683546308, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Pr3_2dxpIUbCeEVs8J6eC" + ], + "frameId": null, + "index": "b1R", + "roundness": { + "type": 3 + }, + "seed": 359299545, + "version": 361, + "versionNonce": 1771116313, + "isDeleted": false, + "boundElements": [ + { + "id": "Rw9JIfOWW5OzgCIEbmrcQ", + "type": "arrow" + } + ], + "updated": 1761488951985, + "link": null, + "locked": false + }, + { + "id": "3RGMj7zOLd30GYK4vC9T2", + "type": "rectangle", + "x": 2929.5520724778735, + "y": 2331.7544218789362, + "width": 177.06528476403008, + "height": 69.9376977924577, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Pr3_2dxpIUbCeEVs8J6eC" + ], + "frameId": null, + "index": "b1S", + "roundness": { + "type": 3 + }, + "seed": 227530425, + "version": 472, + "versionNonce": 1497818329, + "isDeleted": false, + "boundElements": [ + { + "id": "ZDVySgjZGDladVJF7TY10", + "type": "text" + } + ], + "updated": 1761488951985, + "link": null, + "locked": false + }, + { + "id": "ZDVySgjZGDladVJF7TY10", + "type": "text", + "x": 2948.0527782143804, + "y": 2356.7232707751655, + "width": 140.06387329101562, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Pr3_2dxpIUbCeEVs8J6eC" + ], + "frameId": null, + "index": "b1T", + "roundness": null, + "seed": 381065113, + "version": 307, + "versionNonce": 279372217, + "isDeleted": false, + "boundElements": null, + "updated": 1761488951985, + "link": null, + "locked": false, + "text": "capital of France?", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "3RGMj7zOLd30GYK4vC9T2", + "originalText": "capital of France?", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "T_BaeBPhHt92dAV5464dp", + "type": "rectangle", + "x": 2796.2892817361353, + "y": 2421.2574498878676, + "width": 177.06528476403008, + "height": 118.11426935591919, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Pr3_2dxpIUbCeEVs8J6eC" + ], + "frameId": null, + "index": "b1U", + "roundness": { + "type": 3 + }, + "seed": 1393704057, + "version": 541, + "versionNonce": 1488208537, + "isDeleted": false, + "boundElements": null, + "updated": 1761488951985, + "link": null, + "locked": false + }, + { + "id": "laXnPRyumxZcJDVH7K7Kx", + "type": "rectangle", + "x": 2927.2691640507055, + "y": 2567.110229077877, + "width": 177.06528476403008, + "height": 50.75378706578624, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Pr3_2dxpIUbCeEVs8J6eC" + ], + "frameId": null, + "index": "b1V", + "roundness": { + "type": 3 + }, + "seed": 1382434137, + "version": 598, + "versionNonce": 2116192121, + "isDeleted": false, + "boundElements": [ + { + "id": "d8Ry2Pnu3La4WDPOaZodZ", + "type": "text" + } + ], + "updated": 1761488951985, + "link": null, + "locked": false + }, + { + "id": "d8Ry2Pnu3La4WDPOaZodZ", + "type": "text", + "x": 2961.081858617779, + "y": 2582.48712261077, + "width": 109.43989562988281, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Pr3_2dxpIUbCeEVs8J6eC" + ], + "frameId": null, + "index": "b1W", + "roundness": null, + "seed": 1611018809, + "version": 308, + "versionNonce": 1798647897, + "isDeleted": false, + "boundElements": null, + "updated": 1761488951985, + "link": null, + "locked": false, + "text": "3 pargraphs it", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "laXnPRyumxZcJDVH7K7Kx", + "originalText": "3 pargraphs it", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "t5-ivi5mBnKmpuJIJCzMw", + "type": "rectangle", + "x": 2804.1959132633237, + "y": 2630.7356922855215, + "width": 177.06528476403008, + "height": 118.11426935591919, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Pr3_2dxpIUbCeEVs8J6eC" + ], + "frameId": null, + "index": "b1X", + "roundness": { + "type": 3 + }, + "seed": 282428185, + "version": 643, + "versionNonce": 228256983, + "isDeleted": false, + "boundElements": [ + { + "id": "L0H4hiXAsyWATQ5aeuMib", + "type": "arrow" + } + ], + "updated": 1761488974974, + "link": null, + "locked": false + }, + { + "id": "Rw9JIfOWW5OzgCIEbmrcQ", + "type": "arrow", + "x": 2578.3213202398133, + "y": 2168.0077767145754, + "width": 214.4380163139881, + "height": 55.5096769020397, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1Y", + "roundness": { + "type": 2 + }, + "seed": 1370869657, + "version": 28, + "versionNonce": 1970326521, + "isDeleted": false, + "boundElements": null, + "updated": 1761488951985, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 214.4380163139881, + 55.5096769020397 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "XcnSsX5Z9fwrxyW0UTkS_", + "focus": -0.5055428173257479, + "gap": 14 + }, + "endBinding": { + "elementId": "C4SuxeV8QPP4ht4f9cZZt", + "focus": -0.044950465683616866, + "gap": 14 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "8FwxBI4j01qBE7TQ6Vaif", + "type": "line", + "x": 2757.4575969729494, + "y": 2625.024149229188, + "width": 403.82649263136364, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1Z", + "roundness": { + "type": 2 + }, + "seed": 1750762233, + "version": 57, + "versionNonce": 1860734041, + "isDeleted": false, + "boundElements": null, + "updated": 1761488964222, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 403.82649263136364, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "L0H4hiXAsyWATQ5aeuMib", + "type": "arrow", + "x": 2996.605726307653, + "y": 2691.162160109134, + "width": 200.5602360816829, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1h", + "roundness": { + "type": 2 + }, + "seed": 1561926201, + "version": 47, + "versionNonce": 1412791223, + "isDeleted": false, + "boundElements": null, + "updated": 1761488974974, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 200.5602360816829, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "t5-ivi5mBnKmpuJIJCzMw", + "focus": 0.023186582842530484, + "gap": 15.344528280299528 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "cD7sMEH3bgrpNGKdHwOR7", + "type": "text", + "x": 3220.4271479998315, + "y": 2675.3559662248713, + "width": 155.7206268310547, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1i", + "roundness": null, + "seed": 1544185911, + "version": 470, + "versionNonce": 1964131929, + "isDeleted": false, + "boundElements": [], + "updated": 1761488982206, + "link": null, + "locked": false, + "text": "30 tokens", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "30 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_qRO0QEjk6sJdcL4_KJ1Z", + "type": "line", + "x": 3156.360375040576, + "y": 2726.8506167380865, + "width": 316.82986571106903, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1j", + "roundness": { + "type": 2 + }, + "seed": 1745311993, + "version": 104, + "versionNonce": 1797839511, + "isDeleted": false, + "boundElements": [], + "updated": 1761488988178, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 316.82986571106903, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "BvCjCUz0xCCtkkiCUBZ-b", + "type": "line", + "x": 3202.4970183941755, + "y": 2826.554619681258, + "width": 217.8616343911275, + "height": 3.5666435093289692, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1k", + "roundness": { + "type": 2 + }, + "seed": 1227800023, + "version": 261, + "versionNonce": 1068136855, + "isDeleted": false, + "boundElements": [], + "updated": 1761489011095, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 217.8616343911275, + -3.5666435093289692 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "iLcjQBucrzFSwwnpDWNKg", + "type": "text", + "x": 3270.4054662239673, + "y": 2850.723779774316, + "width": 83.35008239746094, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1l", + "roundness": null, + "seed": 845605623, + "version": 441, + "versionNonce": 730740793, + "isDeleted": false, + "boundElements": [], + "updated": 1761489038596, + "link": null, + "locked": false, + "text": "$300", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$300", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "pRQ1rhrWegpRHVf3hyL4l", + "type": "text", + "x": 3241.4409674444237, + "y": 2764.112193858763, + "width": 191.76473999023438, + "height": 39.22392010093499, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1m", + "roundness": null, + "seed": 545545047, + "version": 445, + "versionNonce": 249678425, + "isDeleted": false, + "boundElements": [], + "updated": 1761489005037, + "link": null, + "locked": false, + "text": "x $10/token", + "fontSize": 31.37913608074799, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x $10/token", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "6D4n9Z9BxurtZi412_TFP", + "type": "arrow", + "x": 2280.7256274470947, + "y": 2903.789225825685, + "width": 308.82381106749926, + "height": 305.3796213447449, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1n", + "roundness": { + "type": 2 + }, + "seed": 709244055, + "version": 41, + "versionNonce": 1609607223, + "isDeleted": false, + "boundElements": null, + "updated": 1761489030641, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 308.82381106749926, + 305.3796213447449 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Hz2YBqKCJGwQg_Xa7BsSx", + "type": "arrow", + "x": 3292.9667894167433, + "y": 2940.3792451572735, + "width": 493.3691623294194, + "height": 321.72164498585425, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1o", + "roundness": { + "type": 2 + }, + "seed": 1957469081, + "version": 183, + "versionNonce": 1073154905, + "isDeleted": false, + "boundElements": null, + "updated": 1761489038596, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + -493.3691623294194, + 321.72164498585425 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "hHYRcLJor1D9-npYNtwo4", + "type": "text", + "x": 2621.7441967021623, + "y": 3238.660967388648, + "width": 139.418212890625, + "height": 67.6057036891004, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1p", + "roundness": null, + "seed": 369064471, + "version": 568, + "versionNonce": 1805986841, + "isDeleted": false, + "boundElements": [ + { + "id": "lJFPWGbJSaNNtV4R7Nsmj", + "type": "arrow" + } + ], + "updated": 1761489055038, + "link": null, + "locked": false, + "text": "$340", + "fontSize": 54.08456295128031, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$340", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ON8MSIGxajLGYTsCqjnyN", + "type": "arrow", + "x": 1145.1069404120656, + "y": 2310.9619259965966, + "width": 543.3383938716297, + "height": 1541.8759193319838, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1q", + "roundness": { + "type": 2 + }, + "seed": 1114057079, + "version": 111, + "versionNonce": 935193047, + "isDeleted": false, + "boundElements": null, + "updated": 1761497971028, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 543.3383938716297, + 1541.8759193319838 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "1KYXzWXc2WDrWoMckUd-t", + "focus": 0.19152924292475715, + "gap": 14 + }, + "endBinding": { + "elementId": "pcHasHSEBfy6xsI8-E4nq", + "focus": -0.9060563442702396, + "gap": 25.22556894826721 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "lJFPWGbJSaNNtV4R7Nsmj", + "type": "arrow", + "x": 2689.0841176509193, + "y": 3336.925572351862, + "width": 711.8242516959951, + "height": 529.3238550653127, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1r", + "roundness": { + "type": 2 + }, + "seed": 481060633, + "version": 68, + "versionNonce": 1748415417, + "isDeleted": false, + "boundElements": null, + "updated": 1761489155485, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -711.8242516959951, + 529.3238550653127 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "hHYRcLJor1D9-npYNtwo4", + "focus": -0.7321373458783581, + "gap": 14 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "pcHasHSEBfy6xsI8-E4nq", + "type": "text", + "x": 1713.6709032319627, + "y": 3846.45722503739, + "width": 210.89480489437668, + "height": 111.1002216610093, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1s", + "roundness": null, + "seed": 1155414679, + "version": 629, + "versionNonce": 1364630553, + "isDeleted": false, + "boundElements": [ + { + "id": "ON8MSIGxajLGYTsCqjnyN", + "type": "arrow" + } + ], + "updated": 1761489320926, + "link": null, + "locked": false, + "text": "$461", + "fontSize": 88.88017732880745, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$461", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "m_lN23K_Fpc35bLPfDShE", + "type": "text", + "x": 1727.7498811638984, + "y": 3988.13402287036, + "width": 418.1287077129499, + "height": 157.49947097568713, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1t", + "roundness": null, + "seed": 479959735, + "version": 806, + "versionNonce": 1073468921, + "isDeleted": false, + "boundElements": [ + { + "id": "ON8MSIGxajLGYTsCqjnyN", + "type": "arrow" + } + ], + "updated": 1761497894488, + "link": null, + "locked": false, + "text": "input: $61\noutput: $400", + "fontSize": 62.99978839027487, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "input: $61\noutput: $400", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "T9bixf9m-MfSp9ERicKKK", + "type": "rectangle", + "x": 2057.3796176634573, + "y": 1421.1282180378942, + "width": 453.1229422360434, + "height": 139.15646971810565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1v", + "roundness": { + "type": 3 + }, + "seed": 1210243321, + "version": 172, + "versionNonce": 933998135, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "eR6UP1Gr1qxw9KdCtWd-U" + }, + { + "id": "Me3nUL75zpYhhMI2BzLgC", + "type": "arrow" + } + ], + "updated": 1761489685150, + "link": null, + "locked": false + }, + { + "id": "eR6UP1Gr1qxw9KdCtWd-U", + "type": "text", + "x": 2178.8851729489597, + "y": 1480.706452896947, + "width": 210.11183166503906, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1w", + "roundness": null, + "seed": 679683255, + "version": 127, + "versionNonce": 950456151, + "isDeleted": false, + "boundElements": null, + "updated": 1761489685150, + "link": null, + "locked": false, + "text": "Reasoning/Thinking Models", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "T9bixf9m-MfSp9ERicKKK", + "originalText": "Reasoning/Thinking Models", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "dj_P7aT9QOehqlezy3eP9", + "type": "rectangle", + "x": 2057.6110259012885, + "y": 1255.1102301088645, + "width": 453.1229422360434, + "height": 139.15646971810565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1x", + "roundness": { + "type": 3 + }, + "seed": 1283653625, + "version": 239, + "versionNonce": 1562256791, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "19FtQjTtWM3UhEBFZcn9G" + }, + { + "id": "9rc26Gzga3hUQcLHi4D-g", + "type": "arrow" + } + ], + "updated": 1761489685150, + "link": null, + "locked": false + }, + { + "id": "19FtQjTtWM3UhEBFZcn9G", + "type": "text", + "x": 2161.764591440697, + "y": 1314.6884649679173, + "width": 244.81581115722656, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1y", + "roundness": null, + "seed": 2012387545, + "version": 199, + "versionNonce": 731077303, + "isDeleted": false, + "boundElements": [], + "updated": 1761489685150, + "link": null, + "locked": false, + "text": "Non-Reasoning/Thinking Models", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "dj_P7aT9QOehqlezy3eP9", + "originalText": "Non-Reasoning/Thinking Models", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9rc26Gzga3hUQcLHi4D-g", + "type": "arrow", + "x": 2515.00045035094, + "y": 1327.3451028207871, + "width": 89.65813581639122, + "height": 0.2383331934722719, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1z", + "roundness": { + "type": 2 + }, + "seed": 495194359, + "version": 201, + "versionNonce": 941590329, + "isDeleted": false, + "boundElements": null, + "updated": 1761489685289, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 89.65813581639122, + -0.2383331934722719 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "dj_P7aT9QOehqlezy3eP9", + "focus": 0.04659749212643938, + "gap": 4.266482213608015 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "XnP39T3yRAPiv1ONKXhkI", + "type": "text", + "x": 2621.7280492382415, + "y": 1318.666474377537, + "width": 250.2877655029297, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b20", + "roundness": null, + "seed": 2120179289, + "version": 126, + "versionNonce": 1541349911, + "isDeleted": false, + "boundElements": [ + { + "id": "VjSbO7sFa6bJkvzhmJqYX", + "type": "arrow" + } + ], + "updated": 1761489685150, + "link": null, + "locked": false, + "text": "Input Cost x3-5 = Output Cost", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Input Cost x3-5 = Output Cost", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Me3nUL75zpYhhMI2BzLgC", + "type": "arrow", + "x": 2514.2112228573424, + "y": 1478.3111159402156, + "width": 96.50179944570573, + "height": 1.300208705705927, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b21", + "roundness": { + "type": 2 + }, + "seed": 1393428409, + "version": 210, + "versionNonce": 620509209, + "isDeleted": false, + "boundElements": null, + "updated": 1761489685289, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 96.50179944570573, + 1.300208705705927 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "T9bixf9m-MfSp9ERicKKK", + "focus": -0.21337867224854679, + "gap": 3.708662957841625 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "I5_RnwRiSt1vv7cRjflvC", + "type": "text", + "x": 2624.716786200942, + "y": 1471.2252984525142, + "width": 250.2877655029297, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b22", + "roundness": null, + "seed": 1275281529, + "version": 208, + "versionNonce": 1149478263, + "isDeleted": false, + "boundElements": [], + "updated": 1761489685150, + "link": null, + "locked": false, + "text": "Output Cost x3-5 = Input Cost", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Output Cost x3-5 = Input Cost", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "VjSbO7sFa6bJkvzhmJqYX", + "type": "arrow", + "x": 2730.46191874555, + "y": 1350.0097137776052, + "width": 3.0473544045498784, + "height": 101.75495816461512, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b23", + "roundness": { + "type": 2 + }, + "seed": 649074841, + "version": 197, + "versionNonce": 953142521, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "k4D8p76rBzqfoZaJ_4tCU" + } + ], + "updated": 1761489685289, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 3.0473544045498784, + 101.75495816461512 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "XnP39T3yRAPiv1ONKXhkI", + "focus": 0.13591153488199612, + "gap": 11.343239400068114 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "k4D8p76rBzqfoZaJ_4tCU", + "type": "text", + "x": 3211.893411051659, + "y": 1196.7378067319878, + "width": 37.119964599609375, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b24", + "roundness": null, + "seed": 1997130679, + "version": 6, + "versionNonce": 716265079, + "isDeleted": false, + "boundElements": null, + "updated": 1761489469440, + "link": null, + "locked": false, + "text": "2-5x", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VjSbO7sFa6bJkvzhmJqYX", + "originalText": "2-5x", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "HHsmP7K8vvDoCw6kBcHsK", + "type": "text", + "x": 2241.4722701483, + "y": 444.2349928866404, + "width": 192.1397412853876, + "height": 260.1171860418151, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b25", + "roundness": null, + "seed": 271187513, + "version": 461, + "versionNonce": 1885644697, + "isDeleted": false, + "boundElements": [ + { + "id": "GTNuAdNGC0Vu7n1xly4PY", + "type": "arrow" + }, + { + "id": "iBiSiHlIlCRYOkIGmE_om", + "type": "arrow" + } + ], + "updated": 1761490997534, + "link": null, + "locked": false, + "text": "Text\nReasoning\nAudio\nImage\nVideo\nEmbeddings", + "fontSize": 34.682291472242014, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Text\nReasoning\nAudio\nImage\nVideo\nEmbeddings", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GTNuAdNGC0Vu7n1xly4PY", + "type": "arrow", + "x": 2456.8297376265973, + "y": 466.346671522156, + "width": 184.08413602094743, + "height": 1.7840782474978596, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b26", + "roundness": { + "type": 2 + }, + "seed": 1774094807, + "version": 42, + "versionNonce": 1067200151, + "isDeleted": false, + "boundElements": null, + "updated": 1761490982775, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 184.08413602094743, + -1.7840782474978596 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "HHsmP7K8vvDoCw6kBcHsK", + "focus": -0.815261407474888, + "gap": 23.21772619290965 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "0wOjYB-_zSv6a-X6SKqwT", + "type": "text", + "x": 2655.75696959672, + "y": 452.7514972847261, + "width": 174.75184631347656, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b27", + "roundness": null, + "seed": 954345303, + "version": 51, + "versionNonce": 1530387865, + "isDeleted": false, + "boundElements": null, + "updated": 1761489746806, + "link": null, + "locked": false, + "text": "1 word ~= 0.75 tokens", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1 word ~= 0.75 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "a4FtyyNC-wSdVl6jfEDx_", + "type": "text", + "x": 2655.75696959672, + "y": 488.693574543657, + "width": 174.75184631347656, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b28", + "roundness": null, + "seed": 1085003959, + "version": 102, + "versionNonce": 1394897465, + "isDeleted": false, + "boundElements": null, + "updated": 1761489796211, + "link": null, + "locked": false, + "text": "1 word ~= 0.75 tokens", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1 word ~= 0.75 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_pRlFK6dwriB0oWGCyjOp", + "type": "arrow", + "x": 2416.747798937157, + "y": 505.50785662958174, + "width": 224.03117421440902, + "height": 3.0594291266593245, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b29", + "roundness": { + "type": 2 + }, + "seed": 1141498519, + "version": 84, + "versionNonce": 60703545, + "isDeleted": false, + "boundElements": null, + "updated": 1761489791564, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 224.03117421440902, + -3.0594291266593245 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "HHsmP7K8vvDoCw6kBcHsK", + "focus": -0.5159594739446918, + "gap": 16.802672905238524 + }, + "endBinding": { + "elementId": "psWw-lRqqPU7xa0yvLeGw", + "focus": -0.21058094463330806, + "gap": 14.977996445154076 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "1bUWyMrQ5S2FriA5-0UU4", + "type": "arrow", + "x": 2343.302299389125, + "y": 557.1169559785524, + "width": 297.4766737624409, + "height": 3.0625995809468805, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2A", + "roundness": { + "type": 2 + }, + "seed": 1022692473, + "version": 148, + "versionNonce": 1953544665, + "isDeleted": false, + "boundElements": null, + "updated": 1761489793929, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 297.4766737624409, + -3.0625995809468805 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "NGNDEFvDPgKCInkA-tOny", + "type": "text", + "x": 2649.3281890505677, + "y": 544.3826212000278, + "width": 114.68792724609375, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2B", + "roundness": null, + "seed": 1378289463, + "version": 217, + "versionNonce": 1368280951, + "isDeleted": false, + "boundElements": null, + "updated": 1761490898145, + "link": null, + "locked": false, + "text": "tokens/second", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "tokens/second", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "qvRpBzdFIQQfG0p3i0rnf", + "type": "arrow", + "x": 2350.6002172455965, + "y": 601.3758231010905, + "width": 287.71874665516043, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2C", + "roundness": { + "type": 2 + }, + "seed": 1476435545, + "version": 48, + "versionNonce": 1164419929, + "isDeleted": false, + "boundElements": null, + "updated": 1761489942388, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 287.71874665516043, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "yFHjw-xR77uuz8_JrZG_9", + "type": "text", + "x": 2649.2370125445223, + "y": 590.5001571597311, + "width": 220.86383056640625, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2D", + "roundness": null, + "seed": 1321406423, + "version": 275, + "versionNonce": 1658694999, + "isDeleted": false, + "boundElements": null, + "updated": 1761490013836, + "link": null, + "locked": false, + "text": "tile [32px x 32px] / tokens", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "tile [32px x 32px] / tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "psWw-lRqqPU7xa0yvLeGw", + "type": "text", + "x": 2649.524772821889, + "y": 618.0200034820334, + "width": 199.1998291015625, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2E", + "roundness": null, + "seed": 240485303, + "version": 331, + "versionNonce": 912235705, + "isDeleted": false, + "boundElements": [ + { + "id": "r6iUUZwEWdHXNTxpN7Q_H", + "type": "arrow" + } + ], + "updated": 1761490041851, + "link": null, + "locked": false, + "text": "+ base pricing 100 tokens\n+ quality", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "+ base pricing 100 tokens\n+ quality", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "r6iUUZwEWdHXNTxpN7Q_H", + "type": "arrow", + "x": 2720.0961629504063, + "y": 651.1798802468838, + "width": 35.62914097659541, + "height": 39.76768074958841, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2F", + "roundness": { + "type": 2 + }, + "seed": 295507065, + "version": 26, + "versionNonce": 1580924889, + "isDeleted": false, + "boundElements": null, + "updated": 1761490041851, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 35.62914097659541, + 39.76768074958841 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "psWw-lRqqPU7xa0yvLeGw", + "focus": 0.3473398714967994, + "gap": 6.840123235149576 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "CtL5JazwRboLdy7M2xDno", + "type": "text", + "x": 2713.4999374160557, + "y": 692.7345009099654, + "width": 118.48512055148994, + "height": 14.960256040520685, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2G", + "roundness": null, + "seed": 1774891065, + "version": 455, + "versionNonce": 1093763865, + "isDeleted": false, + "boundElements": null, + "updated": 1761490060974, + "link": null, + "locked": false, + "text": "high: 10 tokens/ tile", + "fontSize": 11.968204832416545, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "high: 10 tokens/ tile", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "FgcBqq_h7ep965sP9T9iz", + "type": "text", + "x": 2714.279278138779, + "y": 710.7619239130444, + "width": 119.77034884468975, + "height": 16.4628379390795, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2H", + "roundness": null, + "seed": 92964441, + "version": 518, + "versionNonce": 2081261495, + "isDeleted": false, + "boundElements": null, + "updated": 1761490128217, + "link": null, + "locked": false, + "text": "low: 2 tokens/ tile", + "fontSize": 13.170270351263602, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "low: 2 tokens/ tile", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EWvIcGh6BJF4uU-GnDEdu", + "type": "rectangle", + "x": 2913.994209340516, + "y": 586.7934627808211, + "width": 34.992656860731586, + "height": 34.992656860731586, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2I", + "roundness": { + "type": 3 + }, + "seed": 1351686457, + "version": 36, + "versionNonce": 261288663, + "isDeleted": false, + "boundElements": null, + "updated": 1761490070495, + "link": null, + "locked": false + }, + { + "id": "GxH3zp4QnlcKT_N-AnyPP", + "type": "rectangle", + "x": 2953.460879165731, + "y": 586.7934627808211, + "width": 34.992656860731586, + "height": 34.992656860731586, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2J", + "roundness": { + "type": 3 + }, + "seed": 481461367, + "version": 69, + "versionNonce": 335953337, + "isDeleted": false, + "boundElements": null, + "updated": 1761490069030, + "link": null, + "locked": false + }, + { + "id": "_eqXPSwg_trhntxxPWMTc", + "type": "rectangle", + "x": 2913.994209340516, + "y": 627.3287695946464, + "width": 34.992656860731586, + "height": 34.992656860731586, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2K", + "roundness": { + "type": 3 + }, + "seed": 1408759417, + "version": 72, + "versionNonce": 8620439, + "isDeleted": false, + "boundElements": null, + "updated": 1761490071667, + "link": null, + "locked": false + }, + { + "id": "SLjCfFONgJh6mwCDrPJ2G", + "type": "rectangle", + "x": 2953.934555276017, + "y": 627.3287695946464, + "width": 34.992656860731586, + "height": 34.992656860731586, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2L", + "roundness": { + "type": 3 + }, + "seed": 51234361, + "version": 142, + "versionNonce": 175267993, + "isDeleted": false, + "boundElements": null, + "updated": 1761490072793, + "link": null, + "locked": false + }, + { + "id": "UaQ2v2NC38uQuR5gSQlnQ", + "type": "rectangle", + "x": 2915.5143452425364, + "y": 587.7920253182886, + "width": 58.763123338886096, + "height": 74.97242800648269, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2M", + "roundness": { + "type": 3 + }, + "seed": 1048825433, + "version": 102, + "versionNonce": 24591065, + "isDeleted": false, + "boundElements": null, + "updated": 1761490080230, + "link": null, + "locked": false + }, + { + "id": "2DKXt_Q-ys3PW8_ip8fyo", + "type": "text", + "x": 2894.1044335548554, + "y": 627.735548248142, + "width": 15.524993036435717, + "height": 8.31833026103136, + "angle": 4.71238898038469, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2N", + "roundness": null, + "seed": 1991842711, + "version": 645, + "versionNonce": 1101614425, + "isDeleted": false, + "boundElements": null, + "updated": 1761490100407, + "link": null, + "locked": false, + "text": "64px", + "fontSize": 6.654664208825089, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "64px", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "dc9XLu44FW6zYkvF-58gH", + "type": "text", + "x": 2942.446172994008, + "y": 572.9024445132573, + "width": 15.487823486328125, + "height": 8.318330261031361, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2O", + "roundness": null, + "seed": 326221207, + "version": 756, + "versionNonce": 2086951735, + "isDeleted": false, + "boundElements": [], + "updated": 1761490108142, + "link": null, + "locked": false, + "text": "48px", + "fontSize": 6.654664208825089, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "48px", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "zNhrduNuuvyonobtk9-Xr", + "type": "arrow", + "x": 2341.472362613034, + "y": 636.7698430755344, + "width": 326.6921121563487, + "height": 149.31297863078692, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2P", + "roundness": { + "type": 2 + }, + "seed": 1098675255, + "version": 81, + "versionNonce": 1814962617, + "isDeleted": false, + "boundElements": null, + "updated": 1761490896694, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 326.6921121563487, + 149.31297863078692 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "LXz2r7MGZvm0rSMq-taXB", + "type": "text", + "x": 2673.2395488470024, + "y": 779.7155776038489, + "width": 233.15179443359375, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2Q", + "roundness": null, + "seed": 1878793655, + "version": 330, + "versionNonce": 574289465, + "isDeleted": false, + "boundElements": [], + "updated": 1761490913626, + "link": null, + "locked": false, + "text": "tokens/second x resol [tiling]", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "tokens/second x resol [tiling]", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "iBiSiHlIlCRYOkIGmE_om", + "type": "arrow", + "x": 2183.93777223495, + "y": 689.6460897084193, + "width": 52.81976468832045, + "height": 0.8942184427736493, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2U", + "roundness": { + "type": 2 + }, + "seed": 1353659545, + "version": 131, + "versionNonce": 1720871641, + "isDeleted": false, + "boundElements": null, + "updated": 1761490999092, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 52.81976468832045, + -0.8942184427736493 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "HHsmP7K8vvDoCw6kBcHsK", + "focus": -0.856225265096597, + "gap": 4.714733225029704 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "wWywLaw0d6-OjxZ1rwPB0", + "type": "text", + "x": 2109.3859576590908, + "y": 665.5330020706278, + "width": 82.30392456054688, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2V", + "roundness": null, + "seed": 1921551447, + "version": 53, + "versionNonce": 1411126009, + "isDeleted": false, + "boundElements": null, + "updated": 1761491008007, + "link": null, + "locked": false, + "text": "characters\ntokens", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "characters\ntokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-4wU9KdrTC81tHFi7IW7w", + "type": "text", + "x": 2312.644096855283, + "y": 283.39159895378117, + "width": 432.35794716952495, + "height": 110.4532703733759, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2W", + "roundness": null, + "seed": 905160503, + "version": 162, + "versionNonce": 1433251737, + "isDeleted": false, + "boundElements": null, + "updated": 1761491303586, + "link": null, + "locked": false, + "text": "Modalities", + "fontSize": 88.36261629870076, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Modalities", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1CEUWyq3wPGbwnYqx9iqK", + "type": "line", + "x": 3543.4345405025683, + "y": 221.5587248438876, + "width": 0, + "height": 3393.656272559854, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2X", + "roundness": { + "type": 2 + }, + "seed": 1035421081, + "version": 300, + "versionNonce": 1451725273, + "isDeleted": false, + "boundElements": null, + "updated": 1761491302151, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 3393.656272559854 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "16w_I0et4UAIpxHs7xdH6", + "type": "text", + "x": 3767.397260627865, + "y": 238.2626222069813, + "width": 656.7197265625, + "height": 130.9323190621764, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2Y", + "roundness": null, + "seed": 2062628151, + "version": 342, + "versionNonce": 1827521401, + "isDeleted": false, + "boundElements": [ + { + "id": "GyEpktmJZqw1Xol3Io-e5", + "type": "arrow" + } + ], + "updated": 1761495312448, + "link": null, + "locked": false, + "text": "Cost Control", + "fontSize": 104.74585524974111, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cost Control", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5l5BTMJxHlXUK4fUsdUNe", + "type": "text", + "x": 3746.982621822668, + "y": 1154.594879658195, + "width": 917.0225893312346, + "height": 130.93231906217636, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2Z", + "roundness": null, + "seed": 1882676569, + "version": 395, + "versionNonce": 407491767, + "isDeleted": false, + "boundElements": [], + "updated": 1761493465533, + "link": null, + "locked": false, + "text": "Cost Optimisation", + "fontSize": 104.74585524974111, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cost Optimisation", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "3aMuHklu1JMYGbRX2oKs7", + "type": "text", + "x": 4562.394816617911, + "y": 219.004078426079, + "width": 420.6520736330191, + "height": 66.27735531917092, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2a", + "roundness": null, + "seed": 282890201, + "version": 470, + "versionNonce": 1691858487, + "isDeleted": false, + "boundElements": null, + "updated": 1761492067077, + "link": null, + "locked": false, + "text": "Cost Estimation", + "fontSize": 53.02188425533668, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cost Estimation", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "OvM-feM-9RslzUTXaas8N", + "type": "text", + "x": 4562.394816617911, + "y": 302.2755441588421, + "width": 399.9828186035156, + "height": 66.27735531917085, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2b", + "roundness": null, + "seed": 1273770743, + "version": 514, + "versionNonce": 1583209465, + "isDeleted": false, + "boundElements": null, + "updated": 1761492342571, + "link": null, + "locked": false, + "text": "Token Counting", + "fontSize": 53.02188425533668, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Token Counting", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GyEpktmJZqw1Xol3Io-e5", + "type": "arrow", + "x": 4021.098027292372, + "y": 380.3763900493533, + "width": 381.8413733559869, + "height": 221.2044858300486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2c", + "roundness": { + "type": 2 + }, + "seed": 1627642681, + "version": 131, + "versionNonce": 28133431, + "isDeleted": false, + "boundElements": null, + "updated": 1761495419229, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 381.8413733559869, + 221.2044858300486 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "16w_I0et4UAIpxHs7xdH6", + "focus": 0.4727389231586848, + "gap": 11.181448780195694 + }, + "endBinding": { + "elementId": "JDynCv0nJ2gofEQoWO7Ap", + "focus": -1.1411888632705778, + "gap": 14 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "JDynCv0nJ2gofEQoWO7Ap", + "type": "text", + "x": 4416.939400648358, + "y": 524.4143839486336, + "width": 350.72723388671875, + "height": 66.27735531917085, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2d", + "roundness": null, + "seed": 1510632441, + "version": 591, + "versionNonce": 374497335, + "isDeleted": false, + "boundElements": [ + { + "id": "GyEpktmJZqw1Xol3Io-e5", + "type": "arrow" + } + ], + "updated": 1761493454164, + "link": null, + "locked": false, + "text": "Input Tokens", + "fontSize": 53.02188425533668, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Input Tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "RMEu6KBmEVypHetudCcOi", + "type": "text", + "x": 4416.939400648358, + "y": 631.6900659461934, + "width": 392.98419189453125, + "height": 66.27735531917085, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2e", + "roundness": null, + "seed": 1997358009, + "version": 644, + "versionNonce": 1364139705, + "isDeleted": false, + "boundElements": null, + "updated": 1761492222184, + "link": null, + "locked": false, + "text": "Output Tokens", + "fontSize": 53.02188425533668, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Output Tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0nVBJ-4HsQOtnG8hjw5Ql", + "type": "arrow", + "x": 4823.41877383776, + "y": 583.7348770756873, + "width": 218.77666289773242, + "height": 5.663156124055604, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2f", + "roundness": { + "type": 2 + }, + "seed": 738708249, + "version": 33, + "versionNonce": 2114486519, + "isDeleted": false, + "boundElements": null, + "updated": 1761492338876, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 218.77666289773242, + -5.663156124055604 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ZYPfnR55eo39PnLYSkK_A", + "type": "arrow", + "x": 4828.8109655539665, + "y": 606.5500802166202, + "width": 197.8897949005368, + "height": 71.9681467248422, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2g", + "roundness": { + "type": 2 + }, + "seed": 693848599, + "version": 24, + "versionNonce": 978632599, + "isDeleted": false, + "boundElements": null, + "updated": 1761492341471, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 197.8897949005368, + 71.9681467248422 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "gkh4brx1NZRWBJ9IpOXSj", + "type": "text", + "x": 5056.286215329681, + "y": 538.5384293970696, + "width": 404.22442626953125, + "height": 66.27735531917085, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2h", + "roundness": null, + "seed": 499297527, + "version": 590, + "versionNonce": 381944313, + "isDeleted": false, + "boundElements": null, + "updated": 1761492349931, + "link": null, + "locked": false, + "text": "Approx (99.5%)", + "fontSize": 53.02188425533668, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Approx (99.5%)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ByJAosiGE_8RU7jjZBTrx", + "type": "text", + "x": 5056.286215329681, + "y": 647.822862930801, + "width": 154.34120178222656, + "height": 66.27735531917085, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2i", + "roundness": null, + "seed": 751709753, + "version": 631, + "versionNonce": 2141419863, + "isDeleted": false, + "boundElements": null, + "updated": 1761492351637, + "link": null, + "locked": false, + "text": "Exact", + "fontSize": 53.02188425533668, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Exact", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "cSYkp2ieDImiwzBcFz1SE", + "type": "arrow", + "x": 4718.239093186597, + "y": 1204.147945470462, + "width": 524.0076176054063, + "height": 27.58101814709221, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2j", + "roundness": { + "type": 2 + }, + "seed": 297902775, + "version": 45, + "versionNonce": 1838931863, + "isDeleted": false, + "boundElements": null, + "updated": 1761493465532, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 524.0076176054063, + -27.58101814709221 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "E1jLPA0SWZGHVehe0OgFt", + "type": "arrow", + "x": 4710.1035749476005, + "y": 1244.5864214022745, + "width": 481.7581500782908, + "height": 226.36720854580835, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2k", + "roundness": { + "type": 2 + }, + "seed": 1606165975, + "version": 50, + "versionNonce": 210329079, + "isDeleted": false, + "boundElements": null, + "updated": 1761493467856, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 481.7581500782908, + 226.36720854580835 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "uDTRjCuIjm8nEIUORF1Ww", + "type": "text", + "x": 5273.321739024742, + "y": 1158.3667289361415, + "width": 207.40921565627144, + "height": 71.99715013616239, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2l", + "roundness": null, + "seed": 923176855, + "version": 102, + "versionNonce": 745293113, + "isDeleted": false, + "boundElements": null, + "updated": 1761495052938, + "link": null, + "locked": false, + "text": "Caching", + "fontSize": 57.59772010892989, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Caching", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "e4-zZ9PTl2_DaOnGOdfSz", + "type": "text", + "x": 5275.578259243532, + "y": 1118.6675146268367, + "width": 164.40650116691666, + "height": 27.21246145005177, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2m", + "roundness": null, + "seed": 1833458137, + "version": 237, + "versionNonce": 912402841, + "isDeleted": false, + "boundElements": null, + "updated": 1761493486098, + "link": null, + "locked": false, + "text": "cache the input", + "fontSize": 21.769969160041416, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cache the input", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "e115w_gl0wNMoRQih9kEQ", + "type": "text", + "x": 5204.801789928291, + "y": 1482.971162016241, + "width": 541.9217529296875, + "height": 71.99715013616236, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2n", + "roundness": null, + "seed": 228541399, + "version": 271, + "versionNonce": 953225081, + "isDeleted": false, + "boundElements": null, + "updated": 1761495052351, + "link": null, + "locked": false, + "text": "service teirs: batch", + "fontSize": 57.59772010892989, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "service teirs: batch", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "BI0r0IgzZ9V7XTruHh5TN", + "type": "text", + "x": 5530.953141089482, + "y": 1183.4084815696256, + "width": 353.41850708783073, + "height": 52.443020481421506, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2o", + "roundness": null, + "seed": 355058135, + "version": 232, + "versionNonce": 2091723545, + "isDeleted": false, + "boundElements": null, + "updated": 1761494390546, + "link": null, + "locked": false, + "text": "20%-10x cheaper", + "fontSize": 41.95441638513719, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "20%-10x cheaper", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "hmXVD1dhTZ0xfU0ORlq1w", + "type": "text", + "x": 6017.214305054997, + "y": 978.3530934189757, + "width": 203.89852905273438, + "height": 43.70435983659119, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2p", + "roundness": null, + "seed": 1754392663, + "version": 847, + "versionNonce": 235870809, + "isDeleted": false, + "boundElements": [ + { + "id": "b5w0s4dXtcKtxidPFiZVN", + "type": "arrow" + } + ], + "updated": 1761493648229, + "link": null, + "locked": false, + "text": "Everyone else", + "fontSize": 32.37359987895643, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Everyone else", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "HaEc7Ts0wHFvFQh04T-Bm", + "type": "text", + "x": 6016.82572089446, + "y": 1304.3767688738667, + "width": 144.0464630126953, + "height": 43.70435983659119, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2q", + "roundness": null, + "seed": 2080916025, + "version": 890, + "versionNonce": 233951287, + "isDeleted": false, + "boundElements": [], + "updated": 1761493714347, + "link": null, + "locked": false, + "text": "Anthropic", + "fontSize": 32.37359987895643, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Anthropic", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "8B4BFhunTpNPjaCNVuhqv", + "type": "text", + "x": 6017.214305054997, + "y": 1178.2881338173092, + "width": 102.61283874511719, + "height": 43.70435983659119, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2r", + "roundness": null, + "seed": 397902873, + "version": 927, + "versionNonce": 1101919033, + "isDeleted": false, + "boundElements": null, + "updated": 1761493570764, + "link": null, + "locked": false, + "text": "Gemini", + "fontSize": 32.37359987895643, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Gemini", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "b5w0s4dXtcKtxidPFiZVN", + "type": "arrow", + "x": 6230.549228190228, + "y": 998.3415179497359, + "width": 186.55036175996338, + "height": 13.92878714446897, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2s", + "roundness": { + "type": 2 + }, + "seed": 1790130425, + "version": 53, + "versionNonce": 1564930137, + "isDeleted": false, + "boundElements": null, + "updated": 1761493674602, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 186.55036175996338, + -13.92878714446897 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "hmXVD1dhTZ0xfU0ORlq1w", + "focus": 0.23290369908073466, + "gap": 9.436394082496008 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "SbzCLP-6Qc4-uIU7gNIIt", + "type": "text", + "x": 6425.8886820614425, + "y": 961.9796862993836, + "width": 431.09232264900595, + "height": 49.84423089427375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2t", + "roundness": null, + "seed": 1998883385, + "version": 80, + "versionNonce": 1659572695, + "isDeleted": false, + "boundElements": null, + "updated": 1761494306607, + "link": null, + "locked": false, + "text": "automatically activate", + "fontSize": 39.875384715419, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "automatically activate", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "xWb7fWFLDhvtn0mdEGHQI", + "type": "arrow", + "x": 5524.588739813377, + "y": 1138.1372703272677, + "width": 199.53830610771547, + "height": 245.00889656283243, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2y", + "roundness": { + "type": 2 + }, + "seed": 229672953, + "version": 28, + "versionNonce": 454429655, + "isDeleted": false, + "boundElements": null, + "updated": 1761493646871, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 199.53830610771547, + -245.00889656283243 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "MNP3O-cqEsPa8o8aMxeIL", + "type": "text", + "x": 5662.776784294856, + "y": 790.5945978850484, + "width": 341.6859160236963, + "height": 80.93399969739109, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2z", + "roundness": null, + "seed": 1477693303, + "version": 1045, + "versionNonce": 1067023673, + "isDeleted": false, + "boundElements": [ + { + "id": "b5w0s4dXtcKtxidPFiZVN", + "type": "arrow" + } + ], + "updated": 1761493674602, + "link": null, + "locked": false, + "text": "Exactly match\nprevious input tokens", + "fontSize": 32.37359987895643, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Exactly match previous input tokens", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "JvZnJhXHGllFZTpTiLBhu", + "type": "text", + "x": 5754.513102978377, + "y": 893.7440258977239, + "width": 219.53063704323702, + "height": 77.99923121850253, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b30", + "roundness": null, + "seed": 83450873, + "version": 1214, + "versionNonce": 892458519, + "isDeleted": false, + "boundElements": [ + { + "id": "b5w0s4dXtcKtxidPFiZVN", + "type": "arrow" + }, + { + "id": "Oip6kFsr2WosPOi0BnrDy", + "type": "arrow" + } + ], + "updated": 1761493693858, + "link": null, + "locked": false, + "text": "minimum tokens\nto use caching\n1024 tokens", + "fontSize": 20.799794991600674, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "minimum tokens\nto use caching\n1024 tokens", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "Oip6kFsr2WosPOi0BnrDy", + "type": "arrow", + "x": 5548.513523937944, + "y": 1144.2655885639572, + "width": 197.56419781446948, + "height": 169.3328093126638, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b31", + "roundness": { + "type": 2 + }, + "seed": 760971767, + "version": 48, + "versionNonce": 79727863, + "isDeleted": false, + "boundElements": null, + "updated": 1761493693858, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 197.56419781446948, + -169.3328093126638 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "JvZnJhXHGllFZTpTiLBhu", + "focus": 0.44425237132221285, + "gap": 9.018243059344519 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "cqgkQtA5o_3-806ZSh7zJ", + "type": "arrow", + "x": 6152.775564173967, + "y": 1203.2431753534393, + "width": 257.6764802095895, + "height": 181.80238286405995, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b32", + "roundness": { + "type": 2 + }, + "seed": 505838679, + "version": 135, + "versionNonce": 316571703, + "isDeleted": false, + "boundElements": null, + "updated": 1761493786847, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 257.6764802095895, + -181.80238286405995 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "j5iEq0x1_hUHpgKPPB_vN", + "type": "text", + "x": 6430.648422987938, + "y": 1168.9538398724617, + "width": 429.63897705078125, + "height": 49.84423089427375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b33", + "roundness": null, + "seed": 713917017, + "version": 198, + "versionNonce": 1251405401, + "isDeleted": false, + "boundElements": [ + { + "id": "qj1JGcEx9aCvCMk37_z-7", + "type": "arrow" + } + ], + "updated": 1761493712842, + "link": null, + "locked": false, + "text": "pay for cache storage", + "fontSize": 39.875384715419, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "pay for cache storage", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "qj1JGcEx9aCvCMk37_z-7", + "type": "arrow", + "x": 6156.443518672468, + "y": 1214.6191249028193, + "width": 265.3397998236878, + "height": 21.09643178172246, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b34", + "roundness": { + "type": 2 + }, + "seed": 1069262455, + "version": 49, + "versionNonce": 644089209, + "isDeleted": false, + "boundElements": null, + "updated": 1761493712842, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 265.3397998236878, + -21.09643178172246 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "j5iEq0x1_hUHpgKPPB_vN", + "focus": 0.43183379020576734, + "gap": 8.865104491782404 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Av6zN7x1mYgdT5i3iJoQ1", + "type": "arrow", + "x": 6185.534307730994, + "y": 1321.16121813981, + "width": 207.865007344265, + "height": 43.982113062756525, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b35", + "roundness": { + "type": 2 + }, + "seed": 105313177, + "version": 43, + "versionNonce": 346617367, + "isDeleted": false, + "boundElements": null, + "updated": 1761493716897, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 207.865007344265, + -43.982113062756525 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "8gmwlStNmZUONMvpBdfD8", + "type": "arrow", + "x": 6184.150450329375, + "y": 1324.85899113827, + "width": 220.53553317257956, + "height": 1.4954588049756694, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b36", + "roundness": { + "type": 2 + }, + "seed": 980425527, + "version": 84, + "versionNonce": 1863399031, + "isDeleted": false, + "boundElements": null, + "updated": 1761493720547, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 220.53553317257956, + -1.4954588049756694 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "i40nehYM5opMs_0emU8B8", + "type": "arrow", + "x": 6193.673746832163, + "y": 1333.4969397580553, + "width": 209.11124626537094, + "height": 41.024675873812384, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b37", + "roundness": { + "type": 2 + }, + "seed": 850481047, + "version": 37, + "versionNonce": 1322960153, + "isDeleted": false, + "boundElements": null, + "updated": 1761493723326, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 209.11124626537094, + 41.024675873812384 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "vM3CM88e5VkJ2XWwmDTya", + "type": "text", + "x": 6400.089988728137, + "y": 1246.4425565150477, + "width": 221.15879821777344, + "height": 49.84423089427375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b38", + "roundness": null, + "seed": 300413273, + "version": 321, + "versionNonce": 1439509687, + "isDeleted": false, + "boundElements": null, + "updated": 1761493788649, + "link": null, + "locked": false, + "text": "cache write", + "fontSize": 39.875384715419, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cache write", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ANIXsaeglUJuO4RtPn9Ze", + "type": "text", + "x": 6419.683498361034, + "y": 1295.9340123562474, + "width": 260.78955078125, + "height": 49.84423089427375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b39", + "roundness": null, + "seed": 2078356759, + "version": 385, + "versionNonce": 365530073, + "isDeleted": false, + "boundElements": null, + "updated": 1761493798106, + "link": null, + "locked": false, + "text": "storing cache", + "fontSize": 39.875384715419, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "storing cache", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "BJ89kGroZNlIr0c7ZWUo5", + "type": "text", + "x": 6419.683498361034, + "y": 1355.2799418646941, + "width": 492.91265869140625, + "height": 49.84423089427375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3A", + "roundness": null, + "seed": 2122126041, + "version": 440, + "versionNonce": 174588983, + "isDeleted": false, + "boundElements": [], + "updated": 1761493815620, + "link": null, + "locked": false, + "text": "cache read << discounted", + "fontSize": 39.875384715419, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cache read << discounted", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "NQ5YJm1QYDYVw3hnyUCDE", + "type": "text", + "x": 6400.089988728137, + "y": 796.5363906959863, + "width": 221.15879821777344, + "height": 49.84423089427375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "groupIds": [], + "frameId": null, + "index": "b3B", + "roundness": null, + "seed": 1531934839, + "version": 365, + "versionNonce": 234370903, + "isDeleted": false, + "boundElements": null, + "updated": 1761493791435, + "link": null, + "locked": false, + "text": "cache write", + "fontSize": 39.875384715419, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cache write", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "t0wD-MScnx4VPexB1EAtR", + "type": "line", + "x": 6378.7609482729, + "y": 822.7642774378318, + "width": 275.8675089566823, + "height": 0, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "groupIds": [], + "frameId": null, + "index": "b3C", + "roundness": { + "type": 2 + }, + "seed": 1657091191, + "version": 50, + "versionNonce": 2072313945, + "isDeleted": false, + "boundElements": null, + "updated": 1761493795576, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 275.8675089566823, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "eDWch61kd1jttSmPNx7bs", + "type": "text", + "x": 6402.965608138246, + "y": 853.7506985248873, + "width": 201.99046814924895, + "height": 38.60606954041149, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "groupIds": [], + "frameId": null, + "index": "b3D", + "roundness": null, + "seed": 973290295, + "version": 548, + "versionNonce": 1087430937, + "isDeleted": false, + "boundElements": null, + "updated": 1761493803715, + "link": null, + "locked": false, + "text": "storing cache", + "fontSize": 30.88485563232919, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "storing cache", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "xbMCUM7ZLZRHp5aTbxrDK", + "type": "line", + "x": 6391.48350825553, + "y": 873.3494619073626, + "width": 227.90492259058828, + "height": 0, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "groupIds": [], + "frameId": null, + "index": "b3E", + "roundness": { + "type": 2 + }, + "seed": 640112121, + "version": 51, + "versionNonce": 1542378039, + "isDeleted": false, + "boundElements": null, + "updated": 1761493806568, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 227.90492259058828, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "WKJoDmtrBu21X5p-VjFKs", + "type": "text", + "x": 7631.0436605964505, + "y": -168.17476274605565, + "width": 1073.507345701113, + "height": 199.376923577095, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3F", + "roundness": null, + "seed": 1693178295, + "version": 490, + "versionNonce": 1129546487, + "isDeleted": false, + "boundElements": [ + { + "id": "kyR3_jWlJe7K7Hbm9yFww", + "type": "arrow" + } + ], + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "1. If sonnet 4.5 costs same as Sonnet 3.5, why would\nsomeone use 3.5?\n2. How much does it cost the company input/cost?\n3. How does caching actually work?", + "fontSize": 39.875384715419, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1. If sonnet 4.5 costs same as Sonnet 3.5, why would someone use 3.5?\n2. How much does it cost the company input/cost?\n3. How does caching actually work?", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "zG-yfCa0x4ZodbbBkDOb6", + "type": "text", + "x": 5264.957415779566, + "y": 1590.936344829233, + "width": 395.840087890625, + "height": 52.44302048142149, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3G", + "roundness": null, + "seed": 2097756119, + "version": 326, + "versionNonce": 530876727, + "isDeleted": false, + "boundElements": null, + "updated": 1761494403920, + "link": null, + "locked": false, + "text": "20%-50% discount", + "fontSize": 41.95441638513719, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "20%-50% discount", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GlOih7W_TI3eOPrTlssA4", + "type": "line", + "x": 5199.224835336936, + "y": 1653.7194419842972, + "width": 599.32505800751, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "groupIds": [], + "frameId": null, + "index": "b3H", + "roundness": { + "type": 2 + }, + "seed": 688674905, + "version": 55, + "versionNonce": 463920313, + "isDeleted": false, + "boundElements": null, + "updated": 1761494488088, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 599.32505800751, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "DqrxvjUXXpsISoRaFtW2T", + "type": "text", + "x": 5242.564317953046, + "y": 1694.5202545628229, + "width": 161.6550750732422, + "height": 71.99715013616236, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3I", + "roundness": null, + "seed": 2119995831, + "version": 360, + "versionNonce": 1438617337, + "isDeleted": false, + "boundElements": [ + { + "id": "-SSgINVOVgLfCaSFdG0fB", + "type": "arrow" + } + ], + "updated": 1761494555258, + "link": null, + "locked": false, + "text": "24hrs", + "fontSize": 57.59772010892989, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "24hrs", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-SSgINVOVgLfCaSFdG0fB", + "type": "arrow", + "x": 5416.20313297323, + "y": 1736.2351405933841, + "width": 98.35038202987107, + "height": 0.05665946387034637, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "groupIds": [], + "frameId": null, + "index": "b3J", + "roundness": { + "type": 2 + }, + "seed": 448383065, + "version": 32, + "versionNonce": 87833113, + "isDeleted": false, + "boundElements": null, + "updated": 1761494555258, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 98.35038202987107, + 0.05665946387034637 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "DqrxvjUXXpsISoRaFtW2T", + "focus": 0.15710253417832348, + "gap": 12.087509277709614 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Gb3sM2rmuFWpTj6OrI7Fu", + "type": "text", + "x": 5536.056037367158, + "y": 1719.5733536468667, + "width": 400.14870910772015, + "height": 26.440433484687002, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3K", + "roundness": null, + "seed": 1647483223, + "version": 554, + "versionNonce": 1521357017, + "isDeleted": false, + "boundElements": [ + { + "id": "-SSgINVOVgLfCaSFdG0fB", + "type": "arrow" + } + ], + "updated": 1761495465453, + "link": null, + "locked": false, + "text": "100-1000 chat completesions/requests", + "fontSize": 21.15234678774961, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "100-1000 chat completesions/requests", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "H1zO0UoUTnaLkQftTzIKk", + "type": "rectangle", + "x": 5188.625273245238, + "y": 1927.0990362818502, + "width": 168.63838829826, + "height": 234.71345645723932, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3L", + "roundness": { + "type": 3 + }, + "seed": 1323101751, + "version": 61, + "versionNonce": 1621608919, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "BQo74cagDCumMuRKaoZqk" + }, + { + "id": "EOXkicId-mfv1EH_wa6PP", + "type": "arrow" + } + ], + "updated": 1761494553830, + "link": null, + "locked": false + }, + { + "id": "BQo74cagDCumMuRKaoZqk", + "type": "text", + "x": 5252.400483934895, + "y": 1994.4557645104699, + "width": 41.08796691894531, + "height": 100, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3M", + "roundness": null, + "seed": 1017273561, + "version": 49, + "versionNonce": 580607703, + "isDeleted": false, + "boundElements": null, + "updated": 1761494551471, + "link": null, + "locked": false, + "text": "jsonl\n\nreq 1\nreq 2\nreq 3", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "H1zO0UoUTnaLkQftTzIKk", + "originalText": "jsonl\n\nreq 1\nreq 2\nreq 3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EOXkicId-mfv1EH_wa6PP", + "type": "arrow", + "x": 5359.238714495932, + "y": 1989.7266397830308, + "width": 117.35186356617487, + "height": 64.8621557908848, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3N", + "roundness": { + "type": 2 + }, + "seed": 551465721, + "version": 43, + "versionNonce": 383383735, + "isDeleted": false, + "boundElements": null, + "updated": 1761494553830, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 117.35186356617487, + -64.8621557908848 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "H1zO0UoUTnaLkQftTzIKk", + "focus": -0.04289419521500599, + "gap": 1.975052952434453 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "FP8-A5FjpC8TZ_KUcFmyA", + "type": "text", + "x": 5479.729564282273, + "y": 1897.6004529675747, + "width": 131.4253654458354, + "height": 36.41484365906024, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3O", + "roundness": null, + "seed": 1823432471, + "version": 503, + "versionNonce": 442903831, + "isDeleted": false, + "boundElements": [ + { + "id": "-SSgINVOVgLfCaSFdG0fB", + "type": "arrow" + }, + { + "id": "VUI9CdsFVrmRCrXGi_auH", + "type": "arrow" + } + ], + "updated": 1761494564200, + "link": null, + "locked": false, + "text": "batch api", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "batch api", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "VUI9CdsFVrmRCrXGi_auH", + "type": "arrow", + "x": 5621.625624180041, + "y": 1923.9049449675679, + "width": 52.26593330284686, + "height": 0.6782407997566224, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3P", + "roundness": { + "type": 2 + }, + "seed": 1577705079, + "version": 21, + "versionNonce": 560886327, + "isDeleted": false, + "boundElements": null, + "updated": 1761494564200, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 52.26593330284686, + -0.6782407997566224 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "FP8-A5FjpC8TZ_KUcFmyA", + "focus": 0.47668447455137414, + "gap": 10.470694451933014 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "y1I-h72wpYiVX72rdGjex", + "type": "text", + "x": 5684.3918994531205, + "y": 1904.94795422519, + "width": 111.01437377929688, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3Q", + "roundness": null, + "seed": 2025982583, + "version": 569, + "versionNonce": 494411895, + "isDeleted": false, + "boundElements": [ + { + "id": "Qj8wAA7LCyu8H4pXhpGkk", + "type": "arrow" + } + ], + "updated": 1761494576266, + "link": null, + "locked": false, + "text": "validate", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "validate", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Qj8wAA7LCyu8H4pXhpGkk", + "type": "arrow", + "x": 5810.893411649553, + "y": 1925.8816395441138, + "width": 69.94089378700028, + "height": 5.495878304322559, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3R", + "roundness": { + "type": 2 + }, + "seed": 1148926519, + "version": 24, + "versionNonce": 145422743, + "isDeleted": false, + "boundElements": null, + "updated": 1761494576266, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 69.94089378700028, + -5.495878304322559 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "y1I-h72wpYiVX72rdGjex", + "focus": 0.36797717355043724, + "gap": 15.487138417135611 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "n17pJPGK2JY_4fO-MqaZl", + "type": "text", + "x": 5889.239551340492, + "y": 1904.8246958405045, + "width": 59.30865478515625, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3S", + "roundness": null, + "seed": 247631991, + "version": 601, + "versionNonce": 1974853463, + "isDeleted": false, + "boundElements": [ + { + "id": "Qj8wAA7LCyu8H4pXhpGkk", + "type": "arrow" + }, + { + "id": "wJAG0ghZDayyqXyGyB1LG", + "type": "arrow" + }, + { + "id": "5QJX_DkacV0CB0jqE5zHJ", + "type": "arrow" + } + ], + "updated": 1761494593262, + "link": null, + "locked": false, + "text": "wait", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "wait", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "LpGmFJlRH8guv_uPdSS3D", + "type": "arrow", + "x": 5949.341704817743, + "y": 1888.7362673763955, + "width": 76.26167131759485, + "height": 83.52950741369887, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3T", + "roundness": { + "type": 2 + }, + "seed": 1925511927, + "version": 21, + "versionNonce": 215589049, + "isDeleted": false, + "boundElements": null, + "updated": 1761494575633, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 76.26167131759485, + -83.52950741369887 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "HanAMrXoO-oo-v7etpazH", + "type": "text", + "x": 6028.209446806729, + "y": 1774.1890400934335, + "width": 108.42181396484375, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3U", + "roundness": null, + "seed": 21807063, + "version": 634, + "versionNonce": 2029110553, + "isDeleted": false, + "boundElements": [], + "updated": 1761494579019, + "link": null, + "locked": false, + "text": "success", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "success", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Df1Rw5K5Y1CiGD5tC0A04", + "type": "text", + "x": 6046.454271478597, + "y": 1883.0472638399326, + "width": 91.84684753417969, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3V", + "roundness": null, + "seed": 1322521305, + "version": 693, + "versionNonce": 983417945, + "isDeleted": false, + "boundElements": [ + { + "id": "wJAG0ghZDayyqXyGyB1LG", + "type": "arrow" + } + ], + "updated": 1761494585169, + "link": null, + "locked": false, + "text": "partial", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "partial", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "wJAG0ghZDayyqXyGyB1LG", + "type": "arrow", + "x": 5964.3248651465565, + "y": 1919.6298143350161, + "width": 75.24988233743625, + "height": 10.046339023997461, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3W", + "roundness": { + "type": 2 + }, + "seed": 1091604889, + "version": 45, + "versionNonce": 1418583159, + "isDeleted": false, + "boundElements": null, + "updated": 1761494593262, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 75.24988233743625, + -10.046339023997461 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "n17pJPGK2JY_4fO-MqaZl", + "focus": 0.12013747576548273, + "gap": 15.776659020908482 + }, + "endBinding": { + "elementId": "Df1Rw5K5Y1CiGD5tC0A04", + "focus": -0.04757111015898921, + "gap": 6.879523994603915 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "5XJmbmm-lS6g0Iu5mcMPT", + "type": "text", + "x": 6042.787637244414, + "y": 1967.6087693280049, + "width": 69.12547302246094, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3X", + "roundness": null, + "seed": 907777785, + "version": 732, + "versionNonce": 1933602457, + "isDeleted": false, + "boundElements": [ + { + "id": "5QJX_DkacV0CB0jqE5zHJ", + "type": "arrow" + } + ], + "updated": 1761495468269, + "link": null, + "locked": false, + "text": "error", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "error", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5QJX_DkacV0CB0jqE5zHJ", + "type": "arrow", + "x": 5949.640030242148, + "y": 1936.981361699195, + "width": 81.66473027805023, + "height": 44.78373992814795, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3Y", + "roundness": { + "type": 2 + }, + "seed": 1234314297, + "version": 48, + "versionNonce": 1313420153, + "isDeleted": false, + "boundElements": null, + "updated": 1761495468269, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 81.66473027805023, + 44.78373992814795 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "n17pJPGK2JY_4fO-MqaZl", + "focus": -0.08407225874885951, + "gap": 1.0918241164999927 + }, + "endBinding": { + "elementId": "5XJmbmm-lS6g0Iu5mcMPT", + "focus": -0.5704792945563337, + "gap": 11.482876724216112 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "6Kxj5fU_Q99t3lZGS17X7", + "type": "arrow", + "x": 5856.983581644271, + "y": 1272.1717639276026, + "width": 690.0008332096832, + "height": 410.5081305873914, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3Z", + "roundness": { + "type": 2 + }, + "seed": 27967991, + "version": 54, + "versionNonce": 1946008663, + "isDeleted": false, + "boundElements": null, + "updated": 1761494979286, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 690.0008332096832, + 410.5081305873914 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ab_hJoBUho7SEOc_96QZl", + "type": "arrow", + "x": 6210.269721910188, + "y": 1891.0675241849833, + "width": 340.7680349533275, + "height": 157.14179454483929, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3a", + "roundness": { + "type": 2 + }, + "seed": 1473386871, + "version": 40, + "versionNonce": 1946408951, + "isDeleted": false, + "boundElements": null, + "updated": 1761494981877, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 340.7680349533275, + -157.14179454483929 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "bIPYqZbECti7XkF6lCAfF", + "type": "text", + "x": 6564.203332010826, + "y": 1652.332387035558, + "width": 268.0435739414158, + "height": 95.23587678731397, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3b", + "roundness": null, + "seed": 1074366007, + "version": 1193, + "versionNonce": 2111029111, + "isDeleted": false, + "boundElements": [], + "updated": 1761495041582, + "link": null, + "locked": false, + "text": "Batch + Cache\nOpenAI only\non certain models", + "fontSize": 25.396233809950402, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Batch + Cache\nOpenAI only\non certain models", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "ipPUyMjAI6LkS28UrxKzl", + "type": "arrow", + "x": 4001.767995255268, + "y": 1351.0441654113715, + "width": 164.79064782606292, + "height": 1155.8880415674516, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3c", + "roundness": { + "type": 2 + }, + "seed": 1837681655, + "version": 117, + "versionNonce": 131557817, + "isDeleted": false, + "boundElements": null, + "updated": 1761495051278, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 164.79064782606292, + 1155.8880415674516 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "RXAIZIfs6twb06D_Ybf_w", + "type": "text", + "x": 4157.960447781367, + "y": 2665.2552443466984, + "width": 630.22802734375, + "height": 148.28243240362048, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3d", + "roundness": null, + "seed": 864357113, + "version": 292, + "versionNonce": 595599129, + "isDeleted": false, + "boundElements": [], + "updated": 1761495167458, + "link": null, + "locked": false, + "text": "Distillation", + "fontSize": 118.62594592289639, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Distillation", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "y3zQ2wDeaEw29svg16itD", + "type": "rectangle", + "x": 3954.603977011236, + "y": 2874.0348746041486, + "width": 1198.1193163077755, + "height": 520.2527184391674, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "FcmiDHSVj5bPLm3qBJmhZ" + ], + "frameId": null, + "index": "b3e", + "roundness": { + "type": 3 + }, + "seed": 333544697, + "version": 65, + "versionNonce": 1245222871, + "isDeleted": false, + "boundElements": [ + { + "id": "H9ZAVpUzHIA75j7nxPG9w", + "type": "arrow" + }, + { + "id": "CvdCMITmVoyEuj1AI5wtQ", + "type": "arrow" + } + ], + "updated": 1761495094693, + "link": null, + "locked": false + }, + { + "id": "N9Eraw-JSm4huJE6LziJf", + "type": "text", + "x": 4249.655141621044, + "y": 3030.402209453344, + "width": 565.0572424697712, + "height": 213.7779013055817, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "FcmiDHSVj5bPLm3qBJmhZ" + ], + "frameId": null, + "index": "b3f", + "roundness": null, + "seed": 679048665, + "version": 74, + "versionNonce": 1315188791, + "isDeleted": false, + "boundElements": null, + "updated": 1761495076049, + "link": null, + "locked": false, + "text": "GPT-5", + "fontSize": 171.0223210444655, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "GPT-5", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "q5hz3guMPAWl1wPlhJ63I", + "type": "rectangle", + "x": 4161.661796790835, + "y": 3918.6657889393036, + "width": 813.1793014901759, + "height": 353.10234666982956, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RQY2rj_Sr54ymCGiZAQJx" + ], + "frameId": null, + "index": "b3g", + "roundness": { + "type": 3 + }, + "seed": 2136345753, + "version": 229, + "versionNonce": 1303612921, + "isDeleted": false, + "boundElements": [ + { + "id": "H9ZAVpUzHIA75j7nxPG9w", + "type": "arrow" + }, + { + "id": "CvdCMITmVoyEuj1AI5wtQ", + "type": "arrow" + }, + { + "id": "q73txDMmuSVhOFJrOzeuH", + "type": "arrow" + } + ], + "updated": 1761495209003, + "link": null, + "locked": false + }, + { + "id": "Vy7CuhLLJPhLqs_4jPZKH", + "type": "text", + "x": 4310.605924610022, + "y": 4042.421079031066, + "width": 504.2122795755266, + "height": 106.24981924712135, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RQY2rj_Sr54ymCGiZAQJx" + ], + "frameId": null, + "index": "b3h", + "roundness": null, + "seed": 1229057401, + "version": 314, + "versionNonce": 777354007, + "isDeleted": false, + "boundElements": null, + "updated": 1761495136485, + "link": null, + "locked": false, + "text": "GPT-5 nano", + "fontSize": 84.99985539769709, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "GPT-5 nano", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "H9ZAVpUzHIA75j7nxPG9w", + "type": "arrow", + "x": 4159.0035755729195, + "y": 3395.4089907967473, + "width": 161.81553212197196, + "height": 522.8574322003551, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3i", + "roundness": { + "type": 2 + }, + "seed": 1249375159, + "version": 86, + "versionNonce": 1726842071, + "isDeleted": false, + "boundElements": null, + "updated": 1761495136485, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 161.81553212197196, + 522.8574322003551 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "y3zQ2wDeaEw29svg16itD", + "focus": 0.6996558678330277, + "gap": 2.8012199690424495 + }, + "endBinding": { + "elementId": "q5hz3guMPAWl1wPlhJ63I", + "focus": -0.417728544614062, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "CvdCMITmVoyEuj1AI5wtQ", + "type": "arrow", + "x": 4913.713170446429, + "y": 3395.5136046839484, + "width": 124.53105928465538, + "height": 521.909324106025, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3j", + "roundness": { + "type": 2 + }, + "seed": 787028857, + "version": 85, + "versionNonce": 1521799671, + "isDeleted": false, + "boundElements": null, + "updated": 1761495136485, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -124.53105928465538, + 521.909324106025 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "y3zQ2wDeaEw29svg16itD", + "focus": -0.639016238620781, + "gap": 3.0611124495321747 + }, + "endBinding": { + "elementId": "q5hz3guMPAWl1wPlhJ63I", + "focus": 0.3978162975602766, + "gap": 3.0948774125540695 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "VAHijKQ6JZhmaPB2RrZD3", + "type": "text", + "x": 5025.183995965848, + "y": 3424.450336798316, + "width": 217.14837917433323, + "height": 73.63963488975615, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3k", + "roundness": null, + "seed": 109904217, + "version": 42, + "versionNonce": 901848247, + "isDeleted": false, + "boundElements": null, + "updated": 1761495100725, + "link": null, + "locked": false, + "text": "teacher", + "fontSize": 58.911707911804925, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "teacher", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "LHXbCpms2ZlIrOMoZtDlX", + "type": "text", + "x": 4438.843431164562, + "y": 4315.577510219063, + "width": 227.68710327148438, + "height": 73.63963488975615, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3l", + "roundness": null, + "seed": 470709335, + "version": 155, + "versionNonce": 414859799, + "isDeleted": false, + "boundElements": null, + "updated": 1761495107105, + "link": null, + "locked": false, + "text": "student", + "fontSize": 58.911707911804925, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "student", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Ggj2Imfjl_WilkJbeivU8", + "type": "arrow", + "x": 4911.555626299914, + "y": 2762.2228831535367, + "width": 596.1467200870729, + "height": 7.994635409791044, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3m", + "roundness": { + "type": 2 + }, + "seed": 627837623, + "version": 29, + "versionNonce": 662132857, + "isDeleted": false, + "boundElements": null, + "updated": 1761495165712, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 596.1467200870729, + 7.994635409791044 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "JQHXi_GFLcDCixuKxMkMl", + "type": "text", + "x": 5606.7996880998435, + "y": 2697.625076713171, + "width": 726.9033203125, + "height": 148.28243240362048, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3n", + "roundness": null, + "seed": 928226743, + "version": 357, + "versionNonce": 1334279481, + "isDeleted": false, + "boundElements": null, + "updated": 1761495198363, + "link": null, + "locked": false, + "text": "Experimental", + "fontSize": 118.62594592289639, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Experimental", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "hLkolxzlLhUbDWA4VsJ_w", + "type": "text", + "x": 5664.793750434652, + "y": 3271.3395560406952, + "width": 763.4382934570312, + "height": 148.28243240362048, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3o", + "roundness": null, + "seed": 1150075159, + "version": 461, + "versionNonce": 678215641, + "isDeleted": false, + "boundElements": null, + "updated": 1761495290511, + "link": null, + "locked": false, + "text": "Eval(uations)", + "fontSize": 118.62594592289639, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Eval(uations)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "q73txDMmuSVhOFJrOzeuH", + "type": "arrow", + "x": 4992.349854908822, + "y": 4106.256800657731, + "width": 491.2512649337641, + "height": 0.6058935978826412, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3q", + "roundness": { + "type": 2 + }, + "seed": 1618082679, + "version": 23, + "versionNonce": 864295193, + "isDeleted": false, + "boundElements": null, + "updated": 1761495209003, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 491.2512649337641, + -0.6058935978826412 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "q5hz3guMPAWl1wPlhJ63I", + "focus": 0.06530773713330722, + "gap": 17.508756627810726 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "4tfAi_txGG4NQyBYgppiI", + "type": "text", + "x": 5529.7290807520085, + "y": 4028.960235014998, + "width": 1396.3634232100994, + "height": 741.4121620181024, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3r", + "roundness": null, + "seed": 420736217, + "version": 619, + "versionNonce": 843665815, + "isDeleted": false, + "boundElements": [], + "updated": 1761495269044, + "link": null, + "locked": false, + "text": "1) how do you know\nit made a difference?\n\n2) how much difference\nit mate?", + "fontSize": 118.62594592289639, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1) how do you know\nit made a difference?\n\n2) how much difference it mate?", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "ccFZWb1Z8-09MEca2kyGd", + "type": "arrow", + "x": 6752.842106999806, + "y": 4216.013014596443, + "width": 381.8738754484957, + "height": 32.39004501089039, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3t", + "roundness": { + "type": 2 + }, + "seed": 1822210295, + "version": 29, + "versionNonce": 715300409, + "isDeleted": false, + "boundElements": null, + "updated": 1761495236895, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 381.8738754484957, + -32.39004501089039 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "jbhvWeWEzgDrXLgm6WfWk", + "type": "text", + "x": 7158.137812882067, + "y": 4094.0049336033308, + "width": 348.88139730474643, + "height": 113.7756460508021, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3u", + "roundness": null, + "seed": 2044320247, + "version": 108, + "versionNonce": 1889016665, + "isDeleted": false, + "boundElements": null, + "updated": 1761495264780, + "link": null, + "locked": false, + "text": "YES/NO", + "fontSize": 91.02051684064166, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "YES/NO", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "E6_vqfBqwm3K7tIgBiiVt", + "type": "text", + "x": 7280.06013406331, + "y": 4609.981984522099, + "width": 1042.2799289868876, + "height": 152.56275751054557, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3v", + "roundness": null, + "seed": 621047577, + "version": 214, + "versionNonce": 1765087191, + "isDeleted": false, + "boundElements": [ + { + "id": "cLyaiTEiDAFInU7wyCY2j", + "type": "arrow" + } + ], + "updated": 1761495269044, + "link": null, + "locked": false, + "text": "improve by X%\nor performed upto 80% of teacher", + "fontSize": 61.02510300421822, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "improve by X%\nor performed upto 80% of teacher", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "cLyaiTEiDAFInU7wyCY2j", + "type": "arrow", + "x": 6709.716460884767, + "y": 4636.685876316615, + "width": 509.87149715504165, + "height": 47.890898853839644, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3w", + "roundness": { + "type": 2 + }, + "seed": 982286135, + "version": 68, + "versionNonce": 175703735, + "isDeleted": false, + "boundElements": null, + "updated": 1761495269044, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 509.87149715504165, + 47.890898853839644 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "E6_vqfBqwm3K7tIgBiiVt", + "focus": -0.42276154403379707, + "gap": 14 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ugMdmCMAvtnmuaml57lHQ", + "type": "arrow", + "x": 5925.051369167486, + "y": 2901.0011381297772, + "width": 8.368722863127005, + "height": 280.2314997363869, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3x", + "roundness": { + "type": 2 + }, + "seed": 1204185879, + "version": 54, + "versionNonce": 841685367, + "isDeleted": false, + "boundElements": null, + "updated": 1761495286821, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 8.368722863127005, + 280.2314997363869 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "QhSj_AReuPYEMEz-W0YIw", + "type": "arrow", + "x": 6002.541678613345, + "y": 3864.9243279933858, + "width": 35.33131052003773, + "height": 333.2285431973828, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3y", + "roundness": { + "type": 2 + }, + "seed": 1586942615, + "version": 30, + "versionNonce": 1536019319, + "isDeleted": false, + "boundElements": null, + "updated": 1761495289222, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -35.33131052003773, + -333.2285431973828 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "abno_2b-F-luHcCGvF07Y", + "type": "text", + "x": 6293.3204228041905, + "y": 3473.3686207921637, + "width": 564.5125732421875, + "height": 148.28243240362048, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3z", + "roundness": null, + "seed": 785427831, + "version": 575, + "versionNonce": 2112988473, + "isDeleted": false, + "boundElements": null, + "updated": 1761497715109, + "link": null, + "locked": false, + "text": "Micro eval", + "fontSize": 118.62594592289639, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Micro eval", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_o-f2tR0zrxuZP8-w_W5D", + "type": "text", + "x": 7276.349286995052, + "y": 2018.3407472069812, + "width": 653.1585693359375, + "height": 130.9323190621764, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b40", + "roundness": null, + "seed": 298837241, + "version": 500, + "versionNonce": 1886485751, + "isDeleted": false, + "boundElements": [ + { + "id": "GyEpktmJZqw1Xol3Io-e5", + "type": "arrow" + } + ], + "updated": 1761495483887, + "link": null, + "locked": false, + "text": "Observability", + "fontSize": 104.74585524974111, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Observability", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "UQ5f6NwKHHGBqIZutDl0g", + "type": "text", + "x": 7275.535078010677, + "y": 2182.399897618494, + "width": 441.79327392578125, + "height": 130.9323190621764, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b41", + "roundness": null, + "seed": 1875082009, + "version": 500, + "versionNonce": 1564788247, + "isDeleted": false, + "boundElements": [ + { + "id": "GyEpktmJZqw1Xol3Io-e5", + "type": "arrow" + } + ], + "updated": 1761495483887, + "link": null, + "locked": false, + "text": "Tracing: ", + "fontSize": 104.74585524974111, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Tracing: ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-PY4it_zFX9gLsR8kHDn5", + "type": "rectangle", + "x": 3829.903017427981, + "y": 5362.852204087024, + "width": 308.4676684553824, + "height": 1307.3163746079836, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b43", + "roundness": { + "type": 3 + }, + "seed": 662987895, + "version": 220, + "versionNonce": 1473729241, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false + }, + { + "id": "nBRBR-IwNGuZ5KG7o84Zu", + "type": "text", + "x": 3849.8001715916516, + "y": 5274.766099096859, + "width": 401.14552708130026, + "height": 46.49780132589497, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b44", + "roundness": null, + "seed": 384156729, + "version": 201, + "versionNonce": 2130284473, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "context window usage", + "fontSize": 37.198241060716, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "context window usage", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "fITgfN0l03mTccqrRuxML", + "type": "line", + "x": 3795.6664266116495, + "y": 6034.132501411334, + "width": 452.68736046275626, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b45", + "roundness": { + "type": 2 + }, + "seed": 255502199, + "version": 209, + "versionNonce": 75575449, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 452.68736046275626, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "_M6lOYnb_NHIDuedxqPm9", + "type": "text", + "x": 4172.686446242003, + "y": 5973.592315874368, + "width": 179.47432182988297, + "height": 35.877663496423104, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b46", + "roundness": null, + "seed": 1381785815, + "version": 165, + "versionNonce": 1042396537, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "200k tokens", + "fontSize": 28.702130797138484, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "200k tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rO7SPAu94CDP9oySf_OzB", + "type": "text", + "x": 4172.686446242003, + "y": 5659.538378387054, + "width": 189.70693969726562, + "height": 71.75532699284621, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b47", + "roundness": null, + "seed": 1256610553, + "version": 212, + "versionNonce": 2132713049, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "$1/Mtok IN\n$3/Mtok Out", + "fontSize": 28.702130797138484, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$1/Mtok IN\n$3/Mtok Out", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "gu6A-L-JcHP8NfCWVWLQM", + "type": "text", + "x": 4172.453950237842, + "y": 6157.79208167379, + "width": 190.62533569335938, + "height": 71.75532699284621, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b48", + "roundness": null, + "seed": 1019951481, + "version": 271, + "versionNonce": 1716218681, + "isDeleted": false, + "boundElements": [ + { + "id": "rRVxxSMFnCbLkBAKxUBV3", + "type": "arrow" + } + ], + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "$2/Mtok IN\n$6/Mtok Out", + "fontSize": 28.702130797138484, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$2/Mtok IN\n$6/Mtok Out", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nyw5JCJU9NwaoSo6rmteQ", + "type": "text", + "x": 3849.5491146133936, + "y": 5019.20619455898, + "width": 1104.5997201838404, + "height": 191.81334164103214, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b49", + "roundness": null, + "seed": 617496633, + "version": 296, + "versionNonce": 810725625, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "Context Window Usage based\nRates", + "fontSize": 76.72533665641282, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Context Window Usage based\nRates", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "3Wy3n7POSKgqaoLP-Bvmw", + "type": "text", + "x": 5472.542359871537, + "y": 5019.20619455898, + "width": 439.8357238769531, + "height": 95.90667082051603, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4A", + "roundness": null, + "seed": 777910553, + "version": 347, + "versionNonce": 144976345, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "OpenRouter", + "fontSize": 76.72533665641282, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "OpenRouter", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "S9pA05HYV7chssw9JRG-S", + "type": "text", + "x": 5507.371990957342, + "y": 5197.07909018454, + "width": 373.70306396484375, + "height": 191.81334164103205, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4C", + "roundness": null, + "seed": 1606980343, + "version": 407, + "versionNonce": 1309902521, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "usage: { }\ncost: {}", + "fontSize": 76.72533665641282, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "usage: { }\ncost: {}", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Bb2h-TL9IitebJcFqbQEl", + "type": "text", + "x": 4483.34839456255, + "y": 5956.104978552338, + "width": 157.4398956298828, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4D", + "roundness": null, + "seed": 196371063, + "version": 95, + "versionNonce": 1799636889, + "isDeleted": false, + "boundElements": [ + { + "id": "Ue7Bg19mjMHxD_YJwq2Xk", + "type": "arrow" + } + ], + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "Input Tokens: 200k", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Input Tokens: 200k", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "htzltMgpZp-hK43HGBdFA", + "type": "arrow", + "x": 4381.563121934132, + "y": 5690.762623582585, + "width": 305.49266283366524, + "height": 245.66405138819027, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4E", + "roundness": { + "type": 2 + }, + "seed": 909432889, + "version": 96, + "versionNonce": 1128789337, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 305.49266283366524, + 245.66405138819027 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "wRwXEO-XznZJdi7pWB6Qq", + "type": "text", + "x": 4666.620215452964, + "y": 5955.897858849501, + "width": 82.43194580078125, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4F", + "roundness": null, + "seed": 55229113, + "version": 167, + "versionNonce": 691135033, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "x $1/Mtok", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x $1/Mtok", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "PlOvUMe-kcR3HlEbZIgfI", + "type": "text", + "x": 4483.34839456255, + "y": 6077.056471606476, + "width": 153.8718719482422, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4G", + "roundness": null, + "seed": 1899727769, + "version": 144, + "versionNonce": 420164377, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "Output: 100 tokens", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Output: 100 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "L9HNQ3W_6qxKuOCB0VeA8", + "type": "arrow", + "x": 4381.572301424926, + "y": 6204.882331362219, + "width": 247.5474451602213, + "height": 88.39831101031632, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4H", + "roundness": { + "type": 2 + }, + "seed": 1731074007, + "version": 91, + "versionNonce": 1732732921, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 247.5474451602213, + -88.39831101031632 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "tHNXTEidCMJn6fSZ-LJ91", + "type": "text", + "x": 4666.688386606082, + "y": 6068.918220810483, + "width": 85.83995056152344, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4I", + "roundness": null, + "seed": 402645369, + "version": 230, + "versionNonce": 233439449, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "x $6/Mtok", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x $6/Mtok", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ibVt9ec-DUvhFR7WYinkk", + "type": "text", + "x": 4480.3912280577115, + "y": 6259.5193991317965, + "width": 141.11988830566406, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4J", + "roundness": null, + "seed": 1769829623, + "version": 198, + "versionNonce": 2055634361, + "isDeleted": false, + "boundElements": [ + { + "id": "rRVxxSMFnCbLkBAKxUBV3", + "type": "arrow" + } + ], + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "Input: 100 tokens", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Input: 100 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rRVxxSMFnCbLkBAKxUBV3", + "type": "arrow", + "x": 4360.716892757911, + "y": 6167.183457862122, + "width": 121.41484226352168, + "height": 86.34060512468568, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4K", + "roundness": { + "type": 2 + }, + "seed": 1923934009, + "version": 143, + "versionNonce": 1439377687, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888855, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 121.41484226352168, + 86.34060512468568 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "gu6A-L-JcHP8NfCWVWLQM", + "focus": -0.8931921707584983, + "gap": 2.362393173290002 + }, + "endBinding": { + "elementId": "ibVt9ec-DUvhFR7WYinkk", + "focus": -0.5474481674452429, + "gap": 5.995336144988869 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Ue7Bg19mjMHxD_YJwq2Xk", + "type": "arrow", + "x": 4471.50779227732, + "y": 5970.2182417729355, + "width": 5.025782841136788, + "height": 257.49276809337243, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4L", + "roundness": { + "type": 2 + }, + "seed": 14800505, + "version": 153, + "versionNonce": 517205559, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888855, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 5.025782841136788, + 257.49276809337243 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "Bb2h-TL9IitebJcFqbQEl", + "focus": 1.1542961242015988, + "gap": 11.840602285230489 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "NOODM06cMv-JrZl7WN349", + "type": "text", + "x": 4635.508822635889, + "y": 6255.632851310487, + "width": 86.79995727539062, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4M", + "roundness": null, + "seed": 2096206105, + "version": 256, + "versionNonce": 1425103161, + "isDeleted": false, + "boundElements": null, + "updated": 1761497888757, + "link": null, + "locked": false, + "text": "x $2/Mtok", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x $2/Mtok", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "b_Y5QYC730GTnpw5y3qAY", + "type": "text", + "x": 7616.314165226417, + "y": -315.78330873720336, + "width": 855.7246729667863, + "height": 97.11087892583394, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4N", + "roundness": null, + "seed": 1872565879, + "version": 710, + "versionNonce": 893317241, + "isDeleted": false, + "boundElements": null, + "updated": 1761497745161, + "link": null, + "locked": false, + "text": "Optional Questions", + "fontSize": 77.68870314066716, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Optional Questions", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "RNBjjyJ-mZvCSICN4P0O3", + "type": "arrow", + "x": 8658.072480877112, + "y": -121.72825616116177, + "width": 377.3704127554711, + "height": 68.94381977056025, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4O", + "roundness": { + "type": 2 + }, + "seed": 1282687161, + "version": 151, + "versionNonce": 869610071, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 377.3704127554711, + -68.94381977056025 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "f9KCMFqsTfuFZygtdBY_E", + "type": "text", + "x": 9053.02951777663, + "y": -230.31740613900922, + "width": 239.03553620340244, + "height": 49.84423089427375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4P", + "roundness": null, + "seed": 1901998519, + "version": 640, + "versionNonce": 1498074999, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "Rate Limits", + "fontSize": 39.875384715419, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Rate Limits", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "f1Z4BRDxf-cD8duqPhW_b", + "type": "text", + "x": 9061.064246976746, + "y": -164.87877540928957, + "width": 385.4663133856249, + "height": 99.6884617885475, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4Q", + "roundness": null, + "seed": 540654937, + "version": 747, + "versionNonce": 877643927, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "Amazon Bedrock\nMS Azure", + "fontSize": 39.875384715419, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Amazon Bedrock\nMS Azure", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "SRUds7CuxnkdsVFUa-ueJ", + "type": "arrow", + "x": 8664.84334380725, + "y": -113.39167509592073, + "width": 372.4739417625442, + "height": 13.977532447864633, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4R", + "roundness": { + "type": 2 + }, + "seed": 319616695, + "version": 170, + "versionNonce": 311991735, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 372.4739417625442, + -13.977532447864633 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "eJQSGJTIETcCocG2BENnW", + "type": "rectangle", + "x": 8808.081773150654, + "y": 324.3427028824092, + "width": 313.8462337316723, + "height": 506.6161663750184, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4S", + "roundness": { + "type": 3 + }, + "seed": 1475085847, + "version": 307, + "versionNonce": 390713047, + "isDeleted": false, + "boundElements": [ + { + "id": "6zda9p3e1yIrSgXE1fdE9", + "type": "arrow" + }, + { + "id": "IsB_GGThs4j8zlH5GTy4K", + "type": "arrow" + } + ], + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "Ui8JPqjuh6fT3Hzdg07bz", + "type": "rectangle", + "x": 9030.039438153359, + "y": 437.806346800789, + "width": 88.66423340196752, + "height": 88.66423340196752, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4T", + "roundness": { + "type": 3 + }, + "seed": 1790431481, + "version": 280, + "versionNonce": 1724680759, + "isDeleted": false, + "boundElements": [ + { + "id": "-3tPVe5lC3kadyF5YRSkM", + "type": "text" + }, + { + "id": "CuROQtT1g3s9LhgYmGIth", + "type": "arrow" + } + ], + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "-3tPVe5lC3kadyF5YRSkM", + "type": "text", + "x": 9068.22755766196, + "y": 472.1384635017728, + "width": 12.287994384765625, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4U", + "roundness": null, + "seed": 2036681177, + "version": 232, + "versionNonce": 122432343, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "Q", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Ui8JPqjuh6fT3Hzdg07bz", + "originalText": "Q", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "6H_wUYQE9MIuo08aHHCkg", + "type": "rectangle", + "x": 8931.130460187182, + "y": 436.6914296763863, + "width": 88.66423340196752, + "height": 88.66423340196752, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4V", + "roundness": { + "type": 3 + }, + "seed": 1003000473, + "version": 207, + "versionNonce": 661730937, + "isDeleted": false, + "boundElements": [ + { + "id": "RbOm56niNKnrfvPxj9_gD", + "type": "text" + }, + { + "id": "6zda9p3e1yIrSgXE1fdE9", + "type": "arrow" + }, + { + "id": "CuROQtT1g3s9LhgYmGIth", + "type": "arrow" + } + ], + "updated": 1761497705539, + "link": null, + "locked": false + }, + { + "id": "RbOm56niNKnrfvPxj9_gD", + "type": "text", + "x": 8970.72657682713, + "y": 471.02354637737005, + "width": 9.472000122070312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4W", + "roundness": null, + "seed": 439146361, + "version": 159, + "versionNonce": 90584759, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "V", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "6H_wUYQE9MIuo08aHHCkg", + "originalText": "V", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Y_iTzhtuDEA_bxsPpFR8E", + "type": "rectangle", + "x": 8828.355793598237, + "y": 438.4272717057819, + "width": 88.66423340196752, + "height": 88.66423340196752, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4X", + "roundness": { + "type": 3 + }, + "seed": 1515216921, + "version": 322, + "versionNonce": 1501909177, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "l5hysWszKNFimVyRnVC57" + }, + { + "id": "IsB_GGThs4j8zlH5GTy4K", + "type": "arrow" + }, + { + "id": "6zda9p3e1yIrSgXE1fdE9", + "type": "arrow" + } + ], + "updated": 1761497705539, + "link": null, + "locked": false + }, + { + "id": "l5hysWszKNFimVyRnVC57", + "type": "text", + "x": 8867.783910970607, + "y": 472.75938840676565, + "width": 9.807998657226562, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4Y", + "roundness": null, + "seed": 330855129, + "version": 274, + "versionNonce": 1573879319, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "K", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Y_iTzhtuDEA_bxsPpFR8E", + "originalText": "K", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-bwdomfcP76_9Qp0dxjUb", + "type": "rectangle", + "x": 8800.883040343486, + "y": 238.25916296577992, + "width": 74.437132302799, + "height": 30.46719310927307, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4Z", + "roundness": { + "type": 3 + }, + "seed": 1389394393, + "version": 186, + "versionNonce": 695870551, + "isDeleted": false, + "boundElements": [ + { + "id": "IsB_GGThs4j8zlH5GTy4K", + "type": "arrow" + } + ], + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "wjF31g94-mq-_Q00O66pG", + "type": "rectangle", + "x": 8888.222053946713, + "y": 238.25916296577992, + "width": 74.437132302799, + "height": 30.46719310927307, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4a", + "roundness": { + "type": 3 + }, + "seed": 178947033, + "version": 233, + "versionNonce": 1483879737, + "isDeleted": false, + "boundElements": [ + { + "id": "6zda9p3e1yIrSgXE1fdE9", + "type": "arrow" + }, + { + "id": "IsB_GGThs4j8zlH5GTy4K", + "type": "arrow" + } + ], + "updated": 1761497705538, + "link": null, + "locked": false + }, + { + "id": "vFtR4N8fNefpruZZSnBcT", + "type": "rectangle", + "x": 8981.840104540905, + "y": 238.25916296577992, + "width": 74.437132302799, + "height": 30.46719310927307, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4b", + "roundness": { + "type": 3 + }, + "seed": 449840985, + "version": 297, + "versionNonce": 920664727, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "h14rgcG9GvFCgyhDvv5Tz", + "type": "rectangle", + "x": 9069.382723679733, + "y": 238.25916296577992, + "width": 74.437132302799, + "height": 30.46719310927307, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4c", + "roundness": { + "type": 3 + }, + "seed": 1608280121, + "version": 334, + "versionNonce": 239783863, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "IsB_GGThs4j8zlH5GTy4K", + "type": "arrow", + "x": 8839.942568566408, + "y": 294.5969335880682, + "width": 14.100293593750393, + "height": 128.38474418213872, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4d", + "roundness": { + "type": 2 + }, + "seed": 146174903, + "version": 393, + "versionNonce": 1120478745, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705538, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 14.100293593750393, + 128.38474418213872 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "wjF31g94-mq-_Q00O66pG", + "focus": 2.314441857622907, + "gap": 14 + }, + "endBinding": { + "elementId": "Y_iTzhtuDEA_bxsPpFR8E", + "focus": -0.24551830388926177, + "gap": 15.445593935574948 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "6zda9p3e1yIrSgXE1fdE9", + "type": "arrow", + "x": 8927.869115266069, + "y": 308.9141956998519, + "width": 27.359376490145223, + "height": 109.76463302231394, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4e", + "roundness": { + "type": 2 + }, + "seed": 170797305, + "version": 428, + "versionNonce": 1090991065, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705539, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 27.359376490145223, + 109.76463302231394 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "wjF31g94-mq-_Q00O66pG", + "focus": 0.27759113789264284, + "gap": 14 + }, + "endBinding": { + "elementId": "Y_iTzhtuDEA_bxsPpFR8E", + "focus": 0, + "gap": 14 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "lit_XV0Hy2X-yNdPcxaUb", + "type": "line", + "x": 8805.32274260505, + "y": 281.68165801016767, + "width": 349.8634722048282, + "height": 1.4186980856832747, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4f", + "roundness": { + "type": 2 + }, + "seed": 1425540023, + "version": 241, + "versionNonce": 1567536919, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 349.8634722048282, + 1.4186980856832747 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "CuROQtT1g3s9LhgYmGIth", + "type": "arrow", + "x": 9027.969870976913, + "y": 291.6293187518322, + "width": 23.039784595262972, + "height": 138.08204459720974, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4g", + "roundness": { + "type": 2 + }, + "seed": 1130533751, + "version": 252, + "versionNonce": 2045563289, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705539, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 23.039784595262972, + 138.08204459720974 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "6H_wUYQE9MIuo08aHHCkg", + "focus": 2.2772087051132255, + "gap": 14 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "EYnJ2-DPBh_1s_hIQ8BdP", + "type": "rectangle", + "x": 8802.206094662199, + "y": 542.2445932645934, + "width": 219.49270271361274, + "height": 41.40206713000612, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4i", + "roundness": { + "type": 3 + }, + "seed": 1858417943, + "version": 249, + "versionNonce": 861871447, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "OivgoDbtMBs1zSvSpOjZu" + } + ], + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "OivgoDbtMBs1zSvSpOjZu", + "type": "text", + "x": 8822.624519383262, + "y": 552.9456268295964, + "width": 178.65585327148438, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4j", + "roundness": null, + "seed": 317203319, + "version": 224, + "versionNonce": 1180654199, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "input embedding vector", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "EYnJ2-DPBh_1s_hIQ8BdP", + "originalText": "input embedding vector", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "sZPYeBQV6tXF6nff5CNxS", + "type": "rectangle", + "x": 8742.765147392865, + "y": 405.4081254821401, + "width": 44.9922530628246, + "height": 33.218791497549546, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4k", + "roundness": { + "type": 3 + }, + "seed": 1325196633, + "version": 146, + "versionNonce": 1151005591, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "Wx4Y-7iuRUnWyk2eZj7w-", + "type": "rectangle", + "x": 8742.765147392865, + "y": 451.7612662144835, + "width": 44.9922530628246, + "height": 33.218791497549546, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4l", + "roundness": { + "type": 3 + }, + "seed": 320646713, + "version": 177, + "versionNonce": 1715890359, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "yDgo14ORct4QUBzoRdxiV", + "type": "rectangle", + "x": 8742.765147392865, + "y": 501.1748761494583, + "width": 44.9922530628246, + "height": 33.218791497549546, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4m", + "roundness": { + "type": 3 + }, + "seed": 1202037337, + "version": 230, + "versionNonce": 1762015703, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "iPKPn-VE3FY-obI87DhFh", + "type": "rectangle", + "x": 8742.765147392865, + "y": 563.0392166931047, + "width": 44.9922530628246, + "height": 33.218791497549546, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4n", + "roundness": { + "type": 3 + }, + "seed": 1132827417, + "version": 270, + "versionNonce": 1643046647, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "NEfh3Xofr8GtV0Mipwkou", + "type": "rectangle", + "x": 8742.765147392865, + "y": 747.5877616366845, + "width": 44.9922530628246, + "height": 33.218791497549546, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4o", + "roundness": { + "type": 3 + }, + "seed": 473148855, + "version": 369, + "versionNonce": 1334112279, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "7wKBGHSUbw36d1hOXbA_X", + "type": "line", + "x": 8725.58608429113, + "y": 399.0656637842284, + "width": 0, + "height": 387.65603006469644, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4p", + "roundness": { + "type": 2 + }, + "seed": 2039922777, + "version": 188, + "versionNonce": 1807537463, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 387.65603006469644 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "LExrqrpaJBgIbaPLTPh78", + "type": "arrow", + "x": 8724.497338550378, + "y": 631.185816582562, + "width": 71.15645045597103, + "height": 3.1332520363935146, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4q", + "roundness": { + "type": 2 + }, + "seed": 1447591641, + "version": 134, + "versionNonce": 1039865431, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -71.15645045597103, + 3.1332520363935146 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "4BPre_R1ALXJgp5wnCYSp", + "type": "rectangle", + "x": 8534.675895039121, + "y": 613.8365022390278, + "width": 104.60361992115304, + "height": 41.40206713000612, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4r", + "roundness": { + "type": 3 + }, + "seed": 1400358775, + "version": 385, + "versionNonce": 1830040439, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "JPxPjpbWvam0vtB0vNOeA" + } + ], + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "JPxPjpbWvam0vtB0vNOeA", + "type": "text", + "x": 8565.473722455752, + "y": 624.5375358040309, + "width": 43.007965087890625, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4s", + "roundness": null, + "seed": 1310572695, + "version": 367, + "versionNonce": 1363979415, + "isDeleted": false, + "boundElements": [], + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "cache", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4BPre_R1ALXJgp5wnCYSp", + "originalText": "cache", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "jWXxLZrp4Ud0OZE3QRMQl", + "type": "text", + "x": 8527.974446492812, + "y": 669.2833369917556, + "width": 109.91995239257812, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4t", + "roundness": null, + "seed": 1287050071, + "version": 200, + "versionNonce": 1180238263, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "~20MB/token", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "~20MB/token", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "enOZ05Tfp8Ey3-Ma6YmaZ", + "type": "text", + "x": 8508.892970104092, + "y": 715.2212993190859, + "width": 156.36788940429688, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4u", + "roundness": null, + "seed": 1772021177, + "version": 310, + "versionNonce": 1029550807, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "20 GB 1024 tokens", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "20 GB 1024 tokens", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "XONs3-BpBYP4xIcVDbcON", + "type": "line", + "x": 8542.172741225198, + "y": 707.532105970846, + "width": 92.27209947600295, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4v", + "roundness": { + "type": 2 + }, + "seed": 1508599289, + "version": 129, + "versionNonce": 250560503, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 92.27209947600295, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "fcAo4aqvw1ibKOOvPP__8", + "type": "rectangle", + "x": 9268.633346250415, + "y": 552.620706406487, + "width": 250.84607583297657, + "height": 250.84607583297657, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4w", + "roundness": { + "type": 3 + }, + "seed": 244796697, + "version": 280, + "versionNonce": 219293975, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "5eVjtzW9jDOuI7ipPBlft", + "type": "line", + "x": 9305.43612931439, + "y": 533.5277331394548, + "width": 0, + "height": 319.6935482892857, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4x", + "roundness": { + "type": 2 + }, + "seed": 761942361, + "version": 155, + "versionNonce": 1429925431, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 319.6935482892857 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "LvfhA6HXhLwmvxn-6-541", + "type": "line", + "x": 9341.28578537212, + "y": 532.7294163485599, + "width": 0, + "height": 309.07351230330414, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4y", + "roundness": { + "type": 2 + }, + "seed": 518057401, + "version": 200, + "versionNonce": 1649282903, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 309.07351230330414 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "0Y-vMwUHlGbpXIkplibla", + "type": "line", + "x": 9382.415479038906, + "y": 532.7294163485599, + "width": 0, + "height": 309.07351230330414, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4z", + "roundness": { + "type": 2 + }, + "seed": 688418681, + "version": 232, + "versionNonce": 1587547255, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 309.07351230330414 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "xJ2vbXLtQzkqcHS5eIP81", + "type": "line", + "x": 9418.047977263124, + "y": 532.7294163485599, + "width": 0, + "height": 309.07351230330414, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b50", + "roundness": { + "type": 2 + }, + "seed": 410782265, + "version": 256, + "versionNonce": 905274775, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 309.07351230330414 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "awen3II_-EXFiV8qM2Cax", + "type": "line", + "x": 9465.063695229013, + "y": 532.7294163485599, + "width": 0, + "height": 309.07351230330414, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b51", + "roundness": { + "type": 2 + }, + "seed": 1810530071, + "version": 293, + "versionNonce": 1736612535, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 309.07351230330414 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "ktY71aaw_2Way-bMLY0i_", + "type": "line", + "x": 9241.591745651554, + "y": 596.2718730664474, + "width": 322.47730812941336, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b52", + "roundness": { + "type": 2 + }, + "seed": 1678854137, + "version": 152, + "versionNonce": 401353687, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 322.47730812941336, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "ur0252p4eVj_MIdpoZB6o", + "type": "line", + "x": 9241.591745651554, + "y": 628.5787541832003, + "width": 322.47730812941336, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b53", + "roundness": { + "type": 2 + }, + "seed": 99060793, + "version": 196, + "versionNonce": 1665571063, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 322.47730812941336, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "MgSVJGzEqzGf4gQcJXy0B", + "type": "line", + "x": 9241.591745651554, + "y": 670.3164897838143, + "width": 322.47730812941336, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b54", + "roundness": { + "type": 2 + }, + "seed": 1768367353, + "version": 236, + "versionNonce": 1863737879, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 322.47730812941336, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "MZC4ayP_1aROxJvKvIHNc", + "type": "line", + "x": 9241.591745651554, + "y": 711.8246585318606, + "width": 322.47730812941336, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b55", + "roundness": { + "type": 2 + }, + "seed": 1089930617, + "version": 262, + "versionNonce": 1011877687, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 322.47730812941336, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "M1j6CZ5UQU0AH9jJ1Ek1J", + "type": "line", + "x": 9241.591745651554, + "y": 747.0910713047856, + "width": 322.47730812941336, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b56", + "roundness": { + "type": 2 + }, + "seed": 630536345, + "version": 323, + "versionNonce": 962070615, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 322.47730812941336, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "kk-TPCih6AcSCT3THHoH_", + "type": "line", + "x": 9241.591745651554, + "y": 780.2004281727269, + "width": 322.47730812941336, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b57", + "roundness": { + "type": 2 + }, + "seed": 1138867639, + "version": 368, + "versionNonce": 335734135, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 322.47730812941336, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "XxgrAfslwctA72NA95PyA", + "type": "text", + "x": 9281.966525010508, + "y": 524.4655722491995, + "width": 13.711990356445312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b58", + "roundness": null, + "seed": 1743530393, + "version": 127, + "versionNonce": 1268063895, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "T", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "T", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "dBEIcOuwD2WBjFqPD-H1R", + "type": "text", + "x": 9320.006372931924, + "y": 524.6035834986322, + "width": 13.711990356445312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b59", + "roundness": null, + "seed": 1271238265, + "version": 162, + "versionNonce": 46347191, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "T", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "T", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "BhJ53PbxKXzZHbOeCrQ22", + "type": "text", + "x": 9240.10307111805, + "y": 568.4694658676439, + "width": 13.711990356445312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5A", + "roundness": null, + "seed": 1423624057, + "version": 193, + "versionNonce": 296854743, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "T", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "T", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "CQykfWiv6sXBB5DwNr50T", + "type": "text", + "x": 9240.166763703697, + "y": 604.1040193356451, + "width": 13.711990356445312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5B", + "roundness": null, + "seed": 1088778329, + "version": 255, + "versionNonce": 1475670519, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "T", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "T", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "odkxI0Lh3-CK39mqROm7p", + "type": "rectangle", + "x": 9276.326021985675, + "y": 560.8091075817933, + "width": 57.104771165504644, + "height": 58.46676020061509, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5C", + "roundness": { + "type": 3 + }, + "seed": 351063735, + "version": 245, + "versionNonce": 1318165271, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "bB6UOy6Dicgaz0359wkkF", + "type": "text", + "x": 9642.342609379988, + "y": 524.5930040885692, + "width": 166.47984313964844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5D", + "roundness": null, + "seed": 759068409, + "version": 180, + "versionNonce": 1509695543, + "isDeleted": false, + "boundElements": [ + { + "id": "vnUN1jR7sBa2dJxqNYe93", + "type": "arrow" + } + ], + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "2 tokens = 4 squares", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2 tokens = 4 squares", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Hmh9Fj_ZSeBqLfca7Q9Qc", + "type": "text", + "x": 9642.274884672857, + "y": 670.723060146694, + "width": 172.35182189941406, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5E", + "roundness": null, + "seed": 198037655, + "version": 264, + "versionNonce": 104644215, + "isDeleted": false, + "boundElements": [ + { + "id": "vnUN1jR7sBa2dJxqNYe93", + "type": "arrow" + } + ], + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "4 tokens = 16 squares", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "4 tokens = 16 squares", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "3dyTyEOrjQjMct1SG0XNq", + "type": "text", + "x": 9355.817070039599, + "y": 524.4655722491995, + "width": 13.711990356445312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5F", + "roundness": null, + "seed": 1196475799, + "version": 183, + "versionNonce": 1360710839, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "T", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "T", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Z9aDtre68JmhxdtbOFLlR", + "type": "text", + "x": 9393.856917961015, + "y": 524.6035834986322, + "width": 13.711990356445312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5G", + "roundness": null, + "seed": 206488217, + "version": 218, + "versionNonce": 1135484375, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "T", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "T", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "KyCM0Ykn0eMXtQg-_brDz", + "type": "text", + "x": 9240.10307111805, + "y": 644.5003432542202, + "width": 13.711990356445312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5H", + "roundness": null, + "seed": 1410103415, + "version": 255, + "versionNonce": 1710902007, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "T", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "T", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "aoG8o8FACabRlUpHYsn0T", + "type": "text", + "x": 9240.166763703697, + "y": 680.1348967222215, + "width": 13.711990356445312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5I", + "roundness": null, + "seed": 559353783, + "version": 317, + "versionNonce": 75748375, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false, + "text": "T", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "T", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "j7_9tX-WZog8dVLq551js", + "type": "rectangle", + "x": 9279.930030512875, + "y": 562.9038193590559, + "width": 135.65450177546677, + "height": 135.65450177546677, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5J", + "roundness": { + "type": 3 + }, + "seed": 301348729, + "version": 233, + "versionNonce": 1732196663, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705522, + "link": null, + "locked": false + }, + { + "id": "vnUN1jR7sBa2dJxqNYe93", + "type": "arrow", + "x": 9778.88536684126, + "y": 550.148380690012, + "width": 0.05441304798114288, + "height": 116.95142227392557, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5K", + "roundness": { + "type": 2 + }, + "seed": 1626156729, + "version": 396, + "versionNonce": 1349430329, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "LVkSWOiAO6hDEQeagfGmV" + } + ], + "updated": 1761497705539, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.05441304798114288, + 116.95142227392557 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "bB6UOy6Dicgaz0359wkkF", + "focus": -0.6404029780385315, + "gap": 5.555376601442845 + }, + "endBinding": { + "elementId": "Hmh9Fj_ZSeBqLfca7Q9Qc", + "focus": 0.5845148569591354, + "gap": 3.623257182756447 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "LVkSWOiAO6hDEQeagfGmV", + "type": "text", + "x": 9255.505580345902, + "y": 536.8272207727671, + "width": 36.2879638671875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5L", + "roundness": null, + "seed": 2103768727, + "version": 6, + "versionNonce": 1445386583, + "isDeleted": false, + "boundElements": null, + "updated": 1761496892796, + "link": null, + "locked": false, + "text": "quad", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "vnUN1jR7sBa2dJxqNYe93", + "originalText": "quad", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "kyR3_jWlJe7K7Hbm9yFww", + "type": "arrow", + "x": 8267.983581463064, + "y": 45.316919808816124, + "width": 483.24498425675665, + "height": 281.7943545270199, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5M", + "roundness": { + "type": 2 + }, + "seed": 926266393, + "version": 290, + "versionNonce": 304004377, + "isDeleted": false, + "boundElements": null, + "updated": 1761497705539, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 483.24498425675665, + 281.7943545270199 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "WKJoDmtrBu21X5p-VjFKs", + "focus": 0.13419832013753547, + "gap": 14.114758977776773 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "r0ALbzerWysXUcfPkMVtx", + "type": "rectangle", + "x": 7646.9907252905605, + "y": 1109.6420617623207, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5O", + "roundness": { + "type": 3 + }, + "seed": 896231321, + "version": 107, + "versionNonce": 1720484121, + "isDeleted": false, + "boundElements": [ + { + "id": "C-ljWsPP-b7uCXqKN5kcX", + "type": "text" + } + ], + "updated": 1761497092034, + "link": null, + "locked": false + }, + { + "id": "C-ljWsPP-b7uCXqKN5kcX", + "type": "text", + "x": 7761.773425600544, + "y": 1149.8237304778015, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5P", + "roundness": null, + "seed": 1655508089, + "version": 11, + "versionNonce": 138276695, + "isDeleted": false, + "boundElements": null, + "updated": 1761497092033, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "r0ALbzerWysXUcfPkMVtx", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "DuSrLMwUQlGw7J4j9OOco", + "type": "rectangle", + "x": 7646.9907252905605, + "y": 1230.3524572563877, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5Q", + "roundness": { + "type": 3 + }, + "seed": 1176966489, + "version": 153, + "versionNonce": 2001369335, + "isDeleted": false, + "boundElements": [ + { + "id": "usg_0CJqEsibK3HLHZ9VH", + "type": "text" + } + ], + "updated": 1761497092034, + "link": null, + "locked": false + }, + { + "id": "usg_0CJqEsibK3HLHZ9VH", + "type": "text", + "x": 7761.773425600544, + "y": 1270.5341259718684, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5R", + "roundness": null, + "seed": 1127023161, + "version": 11, + "versionNonce": 2073291895, + "isDeleted": false, + "boundElements": null, + "updated": 1761497092033, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "DuSrLMwUQlGw7J4j9OOco", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "74iiNTE-47hpDGq4gRdmw", + "type": "rectangle", + "x": 7646.9907252905605, + "y": 1347.4458095132957, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5S", + "roundness": { + "type": 3 + }, + "seed": 111301401, + "version": 201, + "versionNonce": 1399780857, + "isDeleted": false, + "boundElements": [ + { + "id": "Q6Bk6I2zJxC5GxsJyHjzf", + "type": "text" + } + ], + "updated": 1761497092034, + "link": null, + "locked": false + }, + { + "id": "Q6Bk6I2zJxC5GxsJyHjzf", + "type": "text", + "x": 7761.773425600544, + "y": 1387.6274782287765, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5T", + "roundness": null, + "seed": 1425704953, + "version": 11, + "versionNonce": 1231898007, + "isDeleted": false, + "boundElements": null, + "updated": 1761497092033, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "74iiNTE-47hpDGq4gRdmw", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "kwNQ6gFmvDgn01js3unmR", + "type": "rectangle", + "x": 7646.9907252905605, + "y": 1466.6532176201767, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5U", + "roundness": { + "type": 3 + }, + "seed": 406397145, + "version": 242, + "versionNonce": 396247575, + "isDeleted": false, + "boundElements": [ + { + "id": "rC8ZAeg2PqZ530MZrkRkM", + "type": "text" + } + ], + "updated": 1761497092034, + "link": null, + "locked": false + }, + { + "id": "rC8ZAeg2PqZ530MZrkRkM", + "type": "text", + "x": 7761.773425600544, + "y": 1506.8348863356575, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5V", + "roundness": null, + "seed": 770809273, + "version": 11, + "versionNonce": 16677559, + "isDeleted": false, + "boundElements": null, + "updated": 1761497092033, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "kwNQ6gFmvDgn01js3unmR", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0f1a73b03kGC7FL9ejPYe", + "type": "rectangle", + "x": 7646.463240342912, + "y": 1580.3256772998914, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5W", + "roundness": { + "type": 3 + }, + "seed": 1967619737, + "version": 284, + "versionNonce": 1777323737, + "isDeleted": false, + "boundElements": [ + { + "id": "IOUojTh3wFftc0ydArRTN", + "type": "text" + } + ], + "updated": 1761497092034, + "link": null, + "locked": false + }, + { + "id": "IOUojTh3wFftc0ydArRTN", + "type": "text", + "x": 7761.245940652896, + "y": 1620.5073460153721, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "_Y_fe8SWZ7tP46WuU5zZv" + ], + "frameId": null, + "index": "b5X", + "roundness": null, + "seed": 485376889, + "version": 54, + "versionNonce": 1458310103, + "isDeleted": false, + "boundElements": null, + "updated": 1761497092033, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "0f1a73b03kGC7FL9ejPYe", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "SzjpGTIlT9My7Z4YFhYfg", + "type": "text", + "x": 8387.629999258368, + "y": 2178.154024888773, + "width": 183.69929177864205, + "height": 63.43212802853799, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b5z", + "roundness": null, + "seed": 238651543, + "version": 75, + "versionNonce": 1104409081, + "isDeleted": false, + "boundElements": null, + "updated": 1761497147573, + "link": null, + "locked": false, + "text": "IDEAL ", + "fontSize": 50.74570242283038, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "IDEAL ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "qglQXyoHzDwztvgmRKt44", + "type": "rectangle", + "x": 8144.512138495121, + "y": 1425.9203386754264, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b60", + "roundness": { + "type": 3 + }, + "seed": 861483129, + "version": 186, + "versionNonce": 1798240217, + "isDeleted": false, + "boundElements": [ + { + "id": "KSeKKbmM6Wp7ESKwYzmAo", + "type": "text" + }, + { + "id": "PHXTHSZwFLNEKknNicC8e", + "type": "arrow" + }, + { + "id": "UmkiSQMLZ2vtmukJh2YfC", + "type": "arrow" + } + ], + "updated": 1761497161852, + "link": null, + "locked": false + }, + { + "id": "KSeKKbmM6Wp7ESKwYzmAo", + "type": "text", + "x": 8259.294838805105, + "y": 1466.1020073909071, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b61", + "roundness": null, + "seed": 1974384985, + "version": 88, + "versionNonce": 1145115511, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "qglQXyoHzDwztvgmRKt44", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Fb1O5aC91PESe4Jh7aeVg", + "type": "rectangle", + "x": 8144.512138495121, + "y": 1546.6307341694933, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b62", + "roundness": { + "type": 3 + }, + "seed": 1780491833, + "version": 232, + "versionNonce": 1564462647, + "isDeleted": false, + "boundElements": [ + { + "id": "GbL8oZAdM1vKfNMXo_jTy", + "type": "text" + } + ], + "updated": 1761497161852, + "link": null, + "locked": false + }, + { + "id": "GbL8oZAdM1vKfNMXo_jTy", + "type": "text", + "x": 8259.294838805105, + "y": 1586.812402884974, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b63", + "roundness": null, + "seed": 730920729, + "version": 88, + "versionNonce": 1876790423, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Fb1O5aC91PESe4Jh7aeVg", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YrQvJv_6s9tzKF1t9ZygZ", + "type": "rectangle", + "x": 8144.512138495121, + "y": 1663.7240864264013, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b64", + "roundness": { + "type": 3 + }, + "seed": 745843705, + "version": 278, + "versionNonce": 1913951417, + "isDeleted": false, + "boundElements": [ + { + "id": "VR5ezpEwluSiU-PYOTHIS", + "type": "text" + } + ], + "updated": 1761497161852, + "link": null, + "locked": false + }, + { + "id": "VR5ezpEwluSiU-PYOTHIS", + "type": "text", + "x": 8259.294838805105, + "y": 1703.905755141882, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b65", + "roundness": null, + "seed": 1154401497, + "version": 88, + "versionNonce": 533586359, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YrQvJv_6s9tzKF1t9ZygZ", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rlmX3_GU-I0kswk18jzfk", + "type": "rectangle", + "x": 8144.512138495121, + "y": 1782.9314945332824, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b66", + "roundness": { + "type": 3 + }, + "seed": 3326393, + "version": 319, + "versionNonce": 1454829399, + "isDeleted": false, + "boundElements": [ + { + "id": "SLS2sLIrbxSpnFuzY5Bv6", + "type": "text" + } + ], + "updated": 1761497161852, + "link": null, + "locked": false + }, + { + "id": "SLS2sLIrbxSpnFuzY5Bv6", + "type": "text", + "x": 8259.294838805105, + "y": 1823.1131632487632, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b67", + "roundness": null, + "seed": 734274201, + "version": 88, + "versionNonce": 1429639895, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "rlmX3_GU-I0kswk18jzfk", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "IyPDt7SbkILX51GP6t5i1", + "type": "rectangle", + "x": 8143.984653547473, + "y": 1896.603954212997, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b68", + "roundness": { + "type": 3 + }, + "seed": 607545209, + "version": 361, + "versionNonce": 1207145881, + "isDeleted": false, + "boundElements": [ + { + "id": "V7J70p8Q56S_wwN-_Kess", + "type": "text" + } + ], + "updated": 1761497161852, + "link": null, + "locked": false + }, + { + "id": "V7J70p8Q56S_wwN-_Kess", + "type": "text", + "x": 8258.767353857456, + "y": 1936.7856229284778, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lzIWDy59LCDWZFJPL7FBd", + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b69", + "roundness": null, + "seed": 1674383449, + "version": 131, + "versionNonce": 2024546295, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "IyPDt7SbkILX51GP6t5i1", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "wO1qCHDMD4XF7TFRKGHTR", + "type": "ellipse", + "x": 8717.626030055802, + "y": 1420.5405146429116, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6A", + "roundness": { + "type": 2 + }, + "seed": 1348181305, + "version": 77, + "versionNonce": 317516919, + "isDeleted": false, + "boundElements": [ + { + "id": "PHXTHSZwFLNEKknNicC8e", + "type": "arrow" + }, + { + "id": "UmkiSQMLZ2vtmukJh2YfC", + "type": "arrow" + } + ], + "updated": 1761497161852, + "link": null, + "locked": false + }, + { + "id": "EOrSVMm_eFCwqPIcllDqJ", + "type": "ellipse", + "x": 8717.626030055802, + "y": 1550.3095171254106, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6B", + "roundness": { + "type": 2 + }, + "seed": 1229295129, + "version": 108, + "versionNonce": 37010423, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161851, + "link": null, + "locked": false + }, + { + "id": "FjgNHMkdlhQqO6sGQneXW", + "type": "ellipse", + "x": 8729.577405713031, + "y": 1675.6039527128103, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6C", + "roundness": { + "type": 2 + }, + "seed": 1971217145, + "version": 271, + "versionNonce": 1917330711, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161851, + "link": null, + "locked": false + }, + { + "id": "B-3KIqJFRoLzdyyP8I9Lg", + "type": "ellipse", + "x": 8721.952845366697, + "y": 1794.8850121235591, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6D", + "roundness": { + "type": 2 + }, + "seed": 1367972825, + "version": 304, + "versionNonce": 441543223, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161851, + "link": null, + "locked": false + }, + { + "id": "jpqWmOu_EpHl7h8thgALO", + "type": "ellipse", + "x": 8720.92498557633, + "y": 1921.521064066385, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6E", + "roundness": { + "type": 2 + }, + "seed": 2105194681, + "version": 390, + "versionNonce": 926223191, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161851, + "link": null, + "locked": false + }, + { + "id": "PHXTHSZwFLNEKknNicC8e", + "type": "arrow", + "x": 8718.63837211849, + "y": 1475.238193704022, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6F", + "roundness": { + "type": 2 + }, + "seed": 1257585049, + "version": 85, + "versionNonce": 1335836409, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "wO1qCHDMD4XF7TFRKGHTR", + "focus": -0.010439817053226512, + "gap": 1.0112659396488384 + }, + "endBinding": { + "elementId": "qglQXyoHzDwztvgmRKt44", + "focus": -0.05471875349087327, + "gap": 1.5351151288796245 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "UmkiSQMLZ2vtmukJh2YfC", + "type": "arrow", + "x": 8413.543045382441, + "y": 1472.4668124914904, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6G", + "roundness": { + "type": 2 + }, + "seed": 187473529, + "version": 74, + "versionNonce": 1815283991, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "qglQXyoHzDwztvgmRKt44", + "focus": -0.26042714260413524, + "gap": 4.137518596455266 + }, + "endBinding": { + "elementId": "wO1qCHDMD4XF7TFRKGHTR", + "focus": -0.5167964857935066, + "gap": 1.20504999961549 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "VgijM38kgceMoX1KUQz-L", + "type": "arrow", + "x": 8724.914076600988, + "y": 1593.777199795945, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6H", + "roundness": { + "type": 2 + }, + "seed": 484730713, + "version": 142, + "versionNonce": 1601902263, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "S4DhBBN3GqmchsrxHlgEf", + "type": "arrow", + "x": 8419.818749864942, + "y": 1591.005818583413, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6I", + "roundness": { + "type": 2 + }, + "seed": 980423737, + "version": 131, + "versionNonce": 1937057751, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "8n6gJJCsQmuEd8wVIzd4U", + "type": "arrow", + "x": 8726.208805215088, + "y": 1717.5275821894088, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6J", + "roundness": { + "type": 2 + }, + "seed": 129180953, + "version": 177, + "versionNonce": 1548752119, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "iZuQtHPpRhkKeJaLOaAGt", + "type": "arrow", + "x": 8421.113478479043, + "y": 1714.7562009768767, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6K", + "roundness": { + "type": 2 + }, + "seed": 1612782073, + "version": 166, + "versionNonce": 26238487, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "NcYeWPjcdsyNn1nKv8q4v", + "type": "arrow", + "x": 8725.17632083713, + "y": 1833.7964381775894, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6L", + "roundness": { + "type": 2 + }, + "seed": 1690137305, + "version": 256, + "versionNonce": 1714062135, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "NvXrIg7NrwnteeiqpSdSv", + "type": "arrow", + "x": 8420.080994101085, + "y": 1831.0250569650573, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6M", + "roundness": { + "type": 2 + }, + "seed": 1243328441, + "version": 245, + "versionNonce": 981664855, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "xRFcWM-MS7kOqp0SvBlms", + "type": "arrow", + "x": 8721.542803077291, + "y": 1957.48082323154, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6N", + "roundness": { + "type": 2 + }, + "seed": 1717522585, + "version": 255, + "versionNonce": 778985847, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "bwzUWsH6blH4d6_nBnQHc", + "type": "arrow", + "x": 8416.447476341245, + "y": 1954.7094420190078, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6O", + "roundness": { + "type": 2 + }, + "seed": 2134627705, + "version": 244, + "versionNonce": 53549719, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "k4hPFLdVlRC2FRAEJxXcG", + "type": "ellipse", + "x": 8720.92498557633, + "y": 2079.371344207054, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "RxoLAuZDDVTxS-8sYRT1w" + ], + "frameId": null, + "index": "b6P", + "roundness": { + "type": 2 + }, + "seed": 1475657305, + "version": 436, + "versionNonce": 1568649143, + "isDeleted": false, + "boundElements": null, + "updated": 1761497161852, + "link": null, + "locked": false + }, + { + "id": "b927msFdGAeHw6T1pQhKK", + "type": "rectangle", + "x": 9012.405505179906, + "y": 1425.7374677864232, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6Q", + "roundness": { + "type": 3 + }, + "seed": 190197431, + "version": 264, + "versionNonce": 946604919, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "L8wM0LORHMqi8UQCzkN9x" + }, + { + "id": "oxewoBXKiOhYLjw-wJ7Pz", + "type": "arrow" + }, + { + "id": "4TdynzA7vCLOVfvUd1wH1", + "type": "arrow" + } + ], + "updated": 1761497406600, + "link": null, + "locked": false + }, + { + "id": "L8wM0LORHMqi8UQCzkN9x", + "type": "text", + "x": 9127.18820548989, + "y": 1465.919136501904, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6R", + "roundness": null, + "seed": 127956535, + "version": 167, + "versionNonce": 334070935, + "isDeleted": false, + "boundElements": null, + "updated": 1761497406600, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "b927msFdGAeHw6T1pQhKK", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7TzcxuTZ16Ah-oTcFDyOq", + "type": "rectangle", + "x": 9012.405505179906, + "y": 1546.44786328049, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6S", + "roundness": { + "type": 3 + }, + "seed": 1031553783, + "version": 310, + "versionNonce": 1671108599, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "DY1uHsJKsTyyw67OFbSr0" + } + ], + "updated": 1761497406600, + "link": null, + "locked": false + }, + { + "id": "DY1uHsJKsTyyw67OFbSr0", + "type": "text", + "x": 9127.18820548989, + "y": 1586.6295319959709, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6T", + "roundness": null, + "seed": 179146551, + "version": 167, + "versionNonce": 243466519, + "isDeleted": false, + "boundElements": null, + "updated": 1761497406600, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "7TzcxuTZ16Ah-oTcFDyOq", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "mPw5LQcPOXemPURKsuDjO", + "type": "rectangle", + "x": 9012.405505179906, + "y": 1663.541215537398, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6U", + "roundness": { + "type": 3 + }, + "seed": 382256951, + "version": 357, + "versionNonce": 355678935, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "0p9V1KCN9R9wfsHguWmRh" + }, + { + "id": "islAvn521qlORRHcB1OVa", + "type": "arrow" + } + ], + "updated": 1761497480215, + "link": null, + "locked": false + }, + { + "id": "0p9V1KCN9R9wfsHguWmRh", + "type": "text", + "x": 9127.18820548989, + "y": 1703.7228842528789, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6V", + "roundness": null, + "seed": 1280419895, + "version": 167, + "versionNonce": 795404119, + "isDeleted": false, + "boundElements": null, + "updated": 1761497406600, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "mPw5LQcPOXemPURKsuDjO", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5Hmn0GFjrSVoL9V1rT0by", + "type": "rectangle", + "x": 9012.405505179906, + "y": 1782.7486236442792, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6W", + "roundness": { + "type": 3 + }, + "seed": 1118598423, + "version": 398, + "versionNonce": 1918709369, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "lGe8kpYcVVrCioOerkr1u" + }, + { + "id": "Diebh_xka0nC4hr21KpG9", + "type": "arrow" + } + ], + "updated": 1761497482778, + "link": null, + "locked": false + }, + { + "id": "lGe8kpYcVVrCioOerkr1u", + "type": "text", + "x": 9127.18820548989, + "y": 1822.93029235976, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6X", + "roundness": null, + "seed": 722621657, + "version": 167, + "versionNonce": 1815756183, + "isDeleted": false, + "boundElements": null, + "updated": 1761497406600, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "5Hmn0GFjrSVoL9V1rT0by", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "yzJYvmc6fnsuDWxwGn6h3", + "type": "rectangle", + "x": 9011.878020232258, + "y": 1896.4210833239938, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6Y", + "roundness": { + "type": 3 + }, + "seed": 1023723929, + "version": 439, + "versionNonce": 795636407, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "IERAR_1thHDhyltaIQaxK" + } + ], + "updated": 1761497406600, + "link": null, + "locked": false + }, + { + "id": "IERAR_1thHDhyltaIQaxK", + "type": "text", + "x": 9126.660720542242, + "y": 1936.6027520394746, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dAxnzPfVC4OCaC2CtqYD9", + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6Z", + "roundness": null, + "seed": 885665401, + "version": 210, + "versionNonce": 1960510423, + "isDeleted": false, + "boundElements": [], + "updated": 1761497406600, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "yzJYvmc6fnsuDWxwGn6h3", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "uXMnMBztN4K3bRJyLAhmA", + "type": "ellipse", + "x": 9585.519396740588, + "y": 1420.3576437539084, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6a", + "roundness": { + "type": 2 + }, + "seed": 1108534073, + "version": 156, + "versionNonce": 1822060791, + "isDeleted": false, + "boundElements": [ + { + "id": "oxewoBXKiOhYLjw-wJ7Pz", + "type": "arrow" + }, + { + "id": "4TdynzA7vCLOVfvUd1wH1", + "type": "arrow" + } + ], + "updated": 1761497406600, + "link": null, + "locked": false + }, + { + "id": "4lpyan2jB_9S1_Fi626pB", + "type": "ellipse", + "x": 9585.519396740588, + "y": 1550.1266462364074, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6b", + "roundness": { + "type": 2 + }, + "seed": 774178041, + "version": 188, + "versionNonce": 471523415, + "isDeleted": false, + "boundElements": [], + "updated": 1761497406600, + "link": null, + "locked": false + }, + { + "id": "oxewoBXKiOhYLjw-wJ7Pz", + "type": "arrow", + "x": 9586.531738803276, + "y": 1475.0553228150188, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6f", + "roundness": { + "type": 2 + }, + "seed": 315732183, + "version": 334, + "versionNonce": 1133719001, + "isDeleted": false, + "boundElements": null, + "updated": 1761497406697, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "uXMnMBztN4K3bRJyLAhmA", + "focus": -0.010439817053243244, + "gap": 1.0112659396488384 + }, + "endBinding": { + "elementId": "b927msFdGAeHw6T1pQhKK", + "focus": -0.05471875349088527, + "gap": 1.5351151288796245 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "4TdynzA7vCLOVfvUd1wH1", + "type": "arrow", + "x": 9281.436412067227, + "y": 1472.2839416024872, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6g", + "roundness": { + "type": 2 + }, + "seed": 1320995033, + "version": 323, + "versionNonce": 826428313, + "isDeleted": false, + "boundElements": null, + "updated": 1761497406697, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "b927msFdGAeHw6T1pQhKK", + "focus": -0.2604271426041478, + "gap": 4.137518596455266 + }, + "endBinding": { + "elementId": "uXMnMBztN4K3bRJyLAhmA", + "focus": -0.5167964857935233, + "gap": 1.20504999961549 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "PBwFRNjcnJG47w3vua35s", + "type": "arrow", + "x": 9592.807443285774, + "y": 1593.5943289069419, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6h", + "roundness": { + "type": 2 + }, + "seed": 501908761, + "version": 222, + "versionNonce": 1632963511, + "isDeleted": false, + "boundElements": [], + "updated": 1761497406600, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "1JyZINl5AqzmhwqMSPzxG", + "type": "arrow", + "x": 9287.712116549728, + "y": 1590.8229476944098, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "jCqaHT5HB1nNqpnXDpKUD" + ], + "frameId": null, + "index": "b6i", + "roundness": { + "type": 2 + }, + "seed": 2020375033, + "version": 211, + "versionNonce": 1883798743, + "isDeleted": false, + "boundElements": [], + "updated": 1761497406600, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "9mNEyZNpC0imIqnP-dkCi", + "type": "line", + "x": 9296.598838225085, + "y": 1667.2357161956884, + "width": 0, + "height": 323.6700824865561, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6q", + "roundness": { + "type": 2 + }, + "seed": 1356367479, + "version": 74, + "versionNonce": 2144825561, + "isDeleted": false, + "boundElements": null, + "updated": 1761497191050, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 323.6700824865561 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "Ow7ATJFzit5edWItfnN25", + "type": "text", + "x": 9274.60175523332, + "y": 2072.6280222033406, + "width": 295.712646484375, + "height": 63.432128028537974, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b6r", + "roundness": null, + "seed": 1763176505, + "version": 173, + "versionNonce": 1221135319, + "isDeleted": false, + "boundElements": null, + "updated": 1761497495601, + "link": null, + "locked": false, + "text": "Bad for Biz", + "fontSize": 50.74570242283038, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Bad for Biz", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YYkvq_onMc8n1YPQR-9Lg", + "type": "rectangle", + "x": 10008.922158603715, + "y": 1433.6663749596348, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6t2", + "roundness": { + "type": 3 + }, + "seed": 1928359865, + "version": 295, + "versionNonce": 1296087897, + "isDeleted": false, + "boundElements": [ + { + "id": "-5u31dNB7A_FkntryrtMv", + "type": "text" + }, + { + "id": "5bbwehpB4urPnJGkh4-Ks", + "type": "arrow" + }, + { + "id": "zpe9Wd5L7f7t_22nIhR5p", + "type": "arrow" + } + ], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "-5u31dNB7A_FkntryrtMv", + "type": "text", + "x": 10123.704858913698, + "y": 1473.8480436751156, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6t4", + "roundness": null, + "seed": 379326617, + "version": 194, + "versionNonce": 1143072825, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YYkvq_onMc8n1YPQR-9Lg", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "L5oDGpzbAV7U9k0cw-7Lf", + "type": "rectangle", + "x": 10008.922158603715, + "y": 1554.3767704537015, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6t8", + "roundness": { + "type": 3 + }, + "seed": 165713273, + "version": 337, + "versionNonce": 1783613145, + "isDeleted": false, + "boundElements": [ + { + "id": "ewCoPjg_vQkSk34VFa9df", + "type": "text" + } + ], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "ewCoPjg_vQkSk34VFa9df", + "type": "text", + "x": 10123.704858913698, + "y": 1594.5584391691823, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tG", + "roundness": null, + "seed": 805404249, + "version": 195, + "versionNonce": 306414521, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "L5oDGpzbAV7U9k0cw-7Lf", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Oyrg9FURR-lQVaeg_2pPS", + "type": "rectangle", + "x": 10008.922158603715, + "y": 1671.4701227106095, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tI", + "roundness": { + "type": 3 + }, + "seed": 936528697, + "version": 383, + "versionNonce": 40674457, + "isDeleted": false, + "boundElements": [ + { + "id": "9tbZwDcHF8r_hudhNV5cz", + "type": "text" + } + ], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "9tbZwDcHF8r_hudhNV5cz", + "type": "text", + "x": 10123.704858913698, + "y": 1711.6517914260903, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tO", + "roundness": null, + "seed": 699825177, + "version": 195, + "versionNonce": 1451141497, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Oyrg9FURR-lQVaeg_2pPS", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ZNSQjc9fwjRWfJw4jUOYs", + "type": "rectangle", + "x": 10008.922158603715, + "y": 1790.6775308174904, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tV", + "roundness": { + "type": 3 + }, + "seed": 899780857, + "version": 424, + "versionNonce": 1740444249, + "isDeleted": false, + "boundElements": [ + { + "id": "xPwVn92miD78yQnUR3lWx", + "type": "text" + } + ], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "xPwVn92miD78yQnUR3lWx", + "type": "text", + "x": 10123.704858913698, + "y": 1830.8591995329712, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tZ", + "roundness": null, + "seed": 1092028889, + "version": 195, + "versionNonce": 452681529, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZNSQjc9fwjRWfJw4jUOYs", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "dYlT5kRYIpyP7UyNQkW12", + "type": "rectangle", + "x": 10008.394673656067, + "y": 1904.349990497205, + "width": 264.893388290865, + "height": 100.36333743096156, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tb", + "roundness": { + "type": 3 + }, + "seed": 891971257, + "version": 466, + "versionNonce": 1855787033, + "isDeleted": false, + "boundElements": [ + { + "id": "DacABRc0Q3Xd1Ve-Y8spw", + "type": "text" + } + ], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "DacABRc0Q3Xd1Ve-Y8spw", + "type": "text", + "x": 10123.17737396605, + "y": 1944.5316592126858, + "width": 35.32798767089844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mGSxCuSb-OUdeFFfNMj1Q", + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tf", + "roundness": null, + "seed": 209659801, + "version": 238, + "versionNonce": 1217766649, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "text": "GPU", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "dYlT5kRYIpyP7UyNQkW12", + "originalText": "GPU", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ujZWhFEM9MkSK136i8tgI", + "type": "ellipse", + "x": 10582.036050164397, + "y": 1428.2865509271198, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tn", + "roundness": { + "type": 2 + }, + "seed": 558419065, + "version": 188, + "versionNonce": 73965017, + "isDeleted": false, + "boundElements": [ + { + "id": "5bbwehpB4urPnJGkh4-Ks", + "type": "arrow" + }, + { + "id": "zpe9Wd5L7f7t_22nIhR5p", + "type": "arrow" + } + ], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "a5FR-G_bvHLt0HlOgxKRS", + "type": "ellipse", + "x": 10582.036050164397, + "y": 1558.0555534096186, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tp", + "roundness": { + "type": 2 + }, + "seed": 994760025, + "version": 213, + "versionNonce": 529719417, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "21XTYvGmHtUlQF3x-aj-c", + "type": "ellipse", + "x": 10593.987425821628, + "y": 1683.3499889970183, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6tv", + "roundness": { + "type": 2 + }, + "seed": 1574486585, + "version": 376, + "versionNonce": 254962009, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "i8Ub83qQpHUOrSyz1fffS", + "type": "ellipse", + "x": 10586.362865475292, + "y": 1802.6310484077674, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6u", + "roundness": { + "type": 2 + }, + "seed": 1440092953, + "version": 409, + "versionNonce": 2007881273, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "A1ajhHYaAJp_kJ1GGf096", + "type": "ellipse", + "x": 10585.335005684925, + "y": 1929.267100350593, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6uC", + "roundness": { + "type": 2 + }, + "seed": 129386489, + "version": 495, + "versionNonce": 468231961, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "5bbwehpB4urPnJGkh4-Ks", + "type": "arrow", + "x": 10581.025768108031, + "y": 1482.975467494995, + "width": 305.7780929847049, + "height": 1.324704103976046, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6uG", + "roundness": { + "type": 2 + }, + "seed": 2105336025, + "version": 400, + "versionNonce": 825348919, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466523, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -305.7780929847049, + -1.324704103976046 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ujZWhFEM9MkSK136i8tgI", + "focus": -0.010439817053226512, + "gap": 1.0112659396481956 + }, + "endBinding": { + "elementId": "YYkvq_onMc8n1YPQR-9Lg", + "focus": -0.05471875349088641, + "gap": 1.4321282287455688 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "zpe9Wd5L7f7t_22nIhR5p", + "type": "arrow", + "x": 10277.660181519124, + "y": 1480.1857856677836, + "width": 309.71355468924776, + "height": 28.618197501251643, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6uV", + "roundness": { + "type": 2 + }, + "seed": 884825529, + "version": 389, + "versionNonce": 1004646775, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466523, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 309.71355468924776, + 28.618197501251643 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "YYkvq_onMc8n1YPQR-9Lg", + "focus": -0.26042714260416094, + "gap": 3.844634624543687 + }, + "endBinding": { + "elementId": "ujZWhFEM9MkSK136i8tgI", + "focus": -0.5167964857935046, + "gap": 1.2050499996148578 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "4wY0e_YevCwHZuxV3vRPY", + "type": "arrow", + "x": 10589.324096709583, + "y": 1601.523236080153, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6uZ", + "roundness": { + "type": 2 + }, + "seed": 748371609, + "version": 247, + "versionNonce": 1097363897, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "H_x9X-K4bTNlVLolFaJ5E", + "type": "arrow", + "x": 10284.228769973537, + "y": 1598.751854867621, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6ul", + "roundness": { + "type": 2 + }, + "seed": 868877177, + "version": 236, + "versionNonce": 449041049, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "L1fSSsas0SLgUCpi3T8rQ", + "type": "arrow", + "x": 10590.618825323681, + "y": 1725.273618473617, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6v", + "roundness": { + "type": 2 + }, + "seed": 1988963417, + "version": 282, + "versionNonce": 2009077625, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "JxHyBLTwOfJzSjAI9y5xn", + "type": "arrow", + "x": 10285.523498587636, + "y": 1722.502237261085, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6vG", + "roundness": { + "type": 2 + }, + "seed": 1287141689, + "version": 271, + "versionNonce": 2057355353, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "4IIeQKy0xDTsAVeTlFvhf", + "type": "arrow", + "x": 10589.586340945725, + "y": 1841.5424744617978, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6vV", + "roundness": { + "type": 2 + }, + "seed": 1202629145, + "version": 361, + "versionNonce": 825838905, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "gIECmz5CDyY-pwOP6-aZg", + "type": "arrow", + "x": 10284.49101420968, + "y": 1838.7710932492657, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6vl", + "roundness": { + "type": 2 + }, + "seed": 6553337, + "version": 350, + "versionNonce": 585973273, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "_gwFRuLywYwz7EZxx9rMY", + "type": "arrow", + "x": 10585.952823185884, + "y": 1965.2268595157484, + "width": 310.76796046138406, + "height": 1.3463214077537486, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6wV", + "roundness": { + "type": 2 + }, + "seed": 626767833, + "version": 360, + "versionNonce": 514855673, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -310.76796046138406, + -1.3463214077537486 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "gnrXrEsvKJzGjcB1iFNoO", + "type": "arrow", + "x": 10280.857496449838, + "y": 1962.4554783032163, + "width": 312.32294692504365, + "height": 28.859310946987534, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b6xV", + "roundness": { + "type": 2 + }, + "seed": 1219056825, + "version": 349, + "versionNonce": 1225083865, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 312.32294692504365, + 28.859310946987534 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "pXwqn4XaFTixC2zPKMGrO", + "type": "ellipse", + "x": 10585.335005684925, + "y": 2087.1173804912623, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b7I", + "roundness": { + "type": 2 + }, + "seed": 677058457, + "version": 542, + "versionNonce": 1778411705, + "isDeleted": false, + "boundElements": null, + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "5Gx752NakjviNbdpIgw8t", + "type": "ellipse", + "x": 10585.335005684925, + "y": 2250.67036517109, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b7J", + "roundness": { + "type": 2 + }, + "seed": 752433401, + "version": 601, + "versionNonce": 2068113817, + "isDeleted": false, + "boundElements": null, + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "YeYaPC9h1yltuB0pJ2aOT", + "type": "ellipse", + "x": 10585.335005684925, + "y": 2423.777283601211, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b7K", + "roundness": { + "type": 2 + }, + "seed": 476556825, + "version": 646, + "versionNonce": 1980124793, + "isDeleted": false, + "boundElements": null, + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "94uIEZW9EQ0mMsJNijuhN", + "type": "ellipse", + "x": 10585.335005684925, + "y": 2572.322550485766, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b7L", + "roundness": { + "type": 2 + }, + "seed": 1529988569, + "version": 694, + "versionNonce": 1627920217, + "isDeleted": false, + "boundElements": null, + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "LvrY0KnYKMN3AX3miI4YK", + "type": "ellipse", + "x": 10585.335005684925, + "y": 2714.2328693551094, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b7M", + "roundness": { + "type": 2 + }, + "seed": 1247926841, + "version": 729, + "versionNonce": 513655865, + "isDeleted": false, + "boundElements": null, + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "ah_CwI4Tsi6taNcuWslbO", + "type": "ellipse", + "x": 10585.335005684925, + "y": 2853.683012381131, + "width": 108.7176681157689, + "height": 108.7176681157689, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "AgB8TzlaY95GCT45wgoEv" + ], + "frameId": null, + "index": "b7N", + "roundness": { + "type": 2 + }, + "seed": 1844467097, + "version": 780, + "versionNonce": 2058016025, + "isDeleted": false, + "boundElements": [], + "updated": 1761497466433, + "link": null, + "locked": false + }, + { + "id": "90e7pc2bmHd3B_zj2xl26", + "type": "text", + "x": 10161.64930726736, + "y": 3017.3726020508147, + "width": 443.2645263671875, + "height": 63.432128028537974, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7O", + "roundness": null, + "seed": 1382077817, + "version": 261, + "versionNonce": 551295639, + "isDeleted": false, + "boundElements": null, + "updated": 1761497269003, + "link": null, + "locked": false, + "text": "Bad for Customer", + "fontSize": 50.74570242283038, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Bad for Customer", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "lvFQcqUx6m2w3t1EDn6pg", + "type": "text", + "x": 10229.279891443122, + "y": 3108.2645108430693, + "width": 295.712646484375, + "height": 63.432128028537974, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7P", + "roundness": null, + "seed": 2080813591, + "version": 306, + "versionNonce": 1741234041, + "isDeleted": false, + "boundElements": [], + "updated": 1761497272350, + "link": null, + "locked": false, + "text": "Bad for Biz", + "fontSize": 50.74570242283038, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Bad for Biz", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5RVOL2d96VtH-52sEU7Le", + "type": "arrow", + "x": 10208.311065123302, + "y": 2259.030635280944, + "width": 665.4209898808203, + "height": 0, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7Q", + "roundness": { + "type": 2 + }, + "seed": 807761623, + "version": 67, + "versionNonce": 1485033751, + "isDeleted": false, + "boundElements": null, + "updated": 1761497282299, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -665.4209898808203, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "hFCfQnfbnFvc8YQz6O4-c", + "type": "arrow", + "x": 9563.495269626303, + "y": 2323.240602876879, + "width": 625.1966517329365, + "height": 0, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7R", + "roundness": { + "type": 2 + }, + "seed": 339187255, + "version": 34, + "versionNonce": 1290840407, + "isDeleted": false, + "boundElements": null, + "updated": 1761497285032, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 625.1966517329365, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "GuKWPUdWiS1FWVFwXUSkc", + "type": "rectangle", + "x": 8972.969066336893, + "y": 1121.9051172871625, + "width": 484.06973668718456, + "height": 102.4722970446062, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7S", + "roundness": { + "type": 3 + }, + "seed": 527001561, + "version": 86, + "versionNonce": 1948540471, + "isDeleted": false, + "boundElements": null, + "updated": 1761497290262, + "link": null, + "locked": false + }, + { + "id": "SozKTa8IB0eV0olvs9Nac", + "type": "rectangle", + "x": 9511.0065400243, + "y": 1121.9051172871625, + "width": 484.06973668718456, + "height": 102.4722970446062, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7T", + "roundness": { + "type": 3 + }, + "seed": 1287682841, + "version": 138, + "versionNonce": 971710199, + "isDeleted": false, + "boundElements": null, + "updated": 1761497291482, + "link": null, + "locked": false + }, + { + "id": "NqnBLrrh2xk2W9pY-rppD", + "type": "rectangle", + "x": 10081.178850677952, + "y": 1121.9051172871625, + "width": 484.06973668718456, + "height": 102.4722970446062, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7U", + "roundness": { + "type": 3 + }, + "seed": 1610442745, + "version": 201, + "versionNonce": 921169943, + "isDeleted": false, + "boundElements": null, + "updated": 1761497292865, + "link": null, + "locked": false + }, + { + "id": "82sgkNsWagp1kxt3H0jgG", + "type": "rectangle", + "x": 10633.855035297547, + "y": 1121.9051172871625, + "width": 484.06973668718456, + "height": 102.4722970446062, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7V", + "roundness": { + "type": 3 + }, + "seed": 252289145, + "version": 284, + "versionNonce": 598493561, + "isDeleted": false, + "boundElements": null, + "updated": 1761497294019, + "link": null, + "locked": false + }, + { + "id": "CsE7rkDGbV-Ur--H2w2S1", + "type": "rectangle", + "x": 9720.581971547797, + "y": 1124.7560538198213, + "width": 66.2795431708746, + "height": 101.22069260571197, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7W", + "roundness": { + "type": 3 + }, + "seed": 189973209, + "version": 48, + "versionNonce": 441594679, + "isDeleted": false, + "boundElements": null, + "updated": 1761497302500, + "link": null, + "locked": false + }, + { + "id": "WiUIoj_8LQv0JpXPvOjp-", + "type": "rectangle", + "x": 10145.561198925476, + "y": 1124.7560538198213, + "width": 66.2795431708746, + "height": 101.22069260571197, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7X", + "roundness": { + "type": 3 + }, + "seed": 2126277847, + "version": 92, + "versionNonce": 963325497, + "isDeleted": false, + "boundElements": null, + "updated": 1761497303119, + "link": null, + "locked": false + }, + { + "id": "aX97Y6-cfE_9UacBQsJnd", + "type": "rectangle", + "x": 9786.641994848133, + "y": 1122.743186090573, + "width": 206.67590042791016, + "height": 101.7186022160513, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7Y", + "roundness": { + "type": 3 + }, + "seed": 1864366489, + "version": 104, + "versionNonce": 1581358775, + "isDeleted": false, + "boundElements": null, + "updated": 1761497459849, + "link": null, + "locked": false + }, + { + "id": "W3SiSw7TGyQFRb7O6L-8L", + "type": "rectangle", + "x": 10358.693211869668, + "y": 1122.743186090573, + "width": 206.67590042791016, + "height": 101.7186022160513, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7Z", + "roundness": { + "type": 3 + }, + "seed": 1520284665, + "version": 189, + "versionNonce": 684135865, + "isDeleted": false, + "boundElements": null, + "updated": 1761497322787, + "link": null, + "locked": false + }, + { + "id": "x9TZYSvb4aZ4oS1KyCYXc", + "type": "rectangle", + "x": 9021.717692442053, + "y": 2652.383865918731, + "width": 369.67042244429103, + "height": 121.28123216310314, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7a", + "roundness": { + "type": 3 + }, + "seed": 1016646999, + "version": 75, + "versionNonce": 1877469655, + "isDeleted": false, + "boundElements": [ + { + "id": "_vn1I7RamdLKzFvfeb-w1", + "type": "text" + } + ], + "updated": 1761497352867, + "link": null, + "locked": false + }, + { + "id": "_vn1I7RamdLKzFvfeb-w1", + "type": "text", + "x": 9170.672936928358, + "y": 2703.0244820002827, + "width": 71.75993347167969, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7b", + "roundness": null, + "seed": 1558383223, + "version": 13, + "versionNonce": 259404345, + "isDeleted": false, + "boundElements": null, + "updated": 1761497352867, + "link": null, + "locked": false, + "text": "Customer", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "x9TZYSvb4aZ4oS1KyCYXc", + "originalText": "Customer", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ZNo95T8V7185phaPdrmDg", + "type": "rectangle", + "x": 9021.445929952239, + "y": 2800.8565542605793, + "width": 369.67042244429103, + "height": 121.28123216310314, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7c", + "roundness": { + "type": 3 + }, + "seed": 1013967287, + "version": 119, + "versionNonce": 444072697, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "jvn5HzR9CCTKEhDWT3_kq" + } + ], + "updated": 1761497360546, + "link": null, + "locked": false + }, + { + "id": "jvn5HzR9CCTKEhDWT3_kq", + "type": "text", + "x": 9159.04918469245, + "y": 2851.497170342131, + "width": 94.46391296386719, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7d", + "roundness": null, + "seed": 587870615, + "version": 69, + "versionNonce": 1716468697, + "isDeleted": false, + "boundElements": null, + "updated": 1761497360546, + "link": null, + "locked": false, + "text": "Researchers", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZNo95T8V7185phaPdrmDg", + "originalText": "Researchers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5VgXpQK45xJNQDCvvzcIJ", + "type": "rectangle", + "x": 9023.273815075818, + "y": 2949.176604611405, + "width": 369.67042244429103, + "height": 121.28123216310314, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7e", + "roundness": { + "type": 3 + }, + "seed": 194242679, + "version": 160, + "versionNonce": 201598295, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "oG9_v4Nqy_mFO9mAUzwum" + } + ], + "updated": 1761497362183, + "link": null, + "locked": false + }, + { + "id": "oG9_v4Nqy_mFO9mAUzwum", + "type": "text", + "x": 9152.485071525014, + "y": 2999.8172206929567, + "width": 111.24790954589844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7f", + "roundness": null, + "seed": 1343078807, + "version": 126, + "versionNonce": 1944612247, + "isDeleted": false, + "boundElements": [], + "updated": 1761497364636, + "link": null, + "locked": false, + "text": "Model Training", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "5VgXpQK45xJNQDCvvzcIJ", + "originalText": "Model Training", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ii_QQU6pEGihlkTv__0fz", + "type": "text", + "x": 8033.245031251816, + "y": 1464.7609620180754, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7g", + "roundness": null, + "seed": 1639813209, + "version": 290, + "versionNonce": 1323630007, + "isDeleted": false, + "boundElements": null, + "updated": 1761497388485, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "HCStReYTv_ztL3PwF994F", + "type": "text", + "x": 8033.245031251816, + "y": 1589.762099067413, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7h", + "roundness": null, + "seed": 1596985, + "version": 345, + "versionNonce": 1926135255, + "isDeleted": false, + "boundElements": null, + "updated": 1761497390016, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "90KUX-cTmJrVUNoYcW1Rf", + "type": "text", + "x": 8033.245031251816, + "y": 1699.5547725929566, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7i", + "roundness": null, + "seed": 1357129785, + "version": 391, + "versionNonce": 1023169495, + "isDeleted": false, + "boundElements": null, + "updated": 1761497391158, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "OH9hfkopKbrzE_0m9K7CF", + "type": "text", + "x": 8033.245031251816, + "y": 1833.5255260692136, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7j", + "roundness": null, + "seed": 1025659641, + "version": 415, + "versionNonce": 1528509719, + "isDeleted": false, + "boundElements": null, + "updated": 1761497392241, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "tLQZ7pAO9i_QK6eamcMMO", + "type": "text", + "x": 8033.245031251816, + "y": 1936.189897796756, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7k", + "roundness": null, + "seed": 357921049, + "version": 452, + "versionNonce": 701008119, + "isDeleted": false, + "boundElements": null, + "updated": 1761497393408, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YIvQvc7BhhhqpgPGD40D6", + "type": "text", + "x": 8844.03992172898, + "y": 1936.189897796756, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7l", + "roundness": null, + "seed": 1784645177, + "version": 529, + "versionNonce": 300799447, + "isDeleted": false, + "boundElements": null, + "updated": 1761497395362, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5hLV_R-mcb3u6vbTyoZQN", + "type": "text", + "x": 8844.03992172898, + "y": 1837.2995712881836, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7m", + "roundness": null, + "seed": 893757913, + "version": 554, + "versionNonce": 1789213751, + "isDeleted": false, + "boundElements": null, + "updated": 1761497396428, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "pg7Z0ADnUtBhjbYKRjoLk", + "type": "text", + "x": 8844.03992172898, + "y": 1707.0654939316948, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7n", + "roundness": null, + "seed": 1600786809, + "version": 579, + "versionNonce": 823434903, + "isDeleted": false, + "boundElements": null, + "updated": 1761497397412, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "iOGnnlnXV6fq1rZLhxmK8", + "type": "text", + "x": 8843.898550413127, + "y": 1576.3284534386607, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7o", + "roundness": null, + "seed": 299059863, + "version": 601, + "versionNonce": 533565017, + "isDeleted": false, + "boundElements": null, + "updated": 1761497404454, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "mIqQJsFyvwVMAA-UAb13X", + "type": "text", + "x": 8843.532808635118, + "y": 1462.0676202373363, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7p", + "roundness": null, + "seed": 1948931191, + "version": 629, + "versionNonce": 2041352825, + "isDeleted": false, + "boundElements": null, + "updated": 1761497402499, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "i9z7uPpIQhrm3gRSjjM5G", + "type": "text", + "x": 9725.789496474084, + "y": 1462.0676202373363, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7q", + "roundness": null, + "seed": 1869517689, + "version": 664, + "versionNonce": 1494238455, + "isDeleted": false, + "boundElements": [], + "updated": 1761497402970, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "cY0_LNDGRa2aUSxTfoij4", + "type": "text", + "x": 9748.005374447497, + "y": 1576.2095513568727, + "width": 79.98837591198286, + "height": 29.83195667352862, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7r", + "roundness": null, + "seed": 872395737, + "version": 674, + "versionNonce": 1994160665, + "isDeleted": false, + "boundElements": null, + "updated": 1761497486872, + "link": null, + "locked": false, + "text": "$10/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$10/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "TQV-D2pCnRv8ISPI09JFe", + "type": "text", + "x": 9165.594181064935, + "y": 2369.6266441214834, + "width": 333.8183898925781, + "height": 63.432128028537974, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7s", + "roundness": null, + "seed": 1947957113, + "version": 257, + "versionNonce": 1301535735, + "isDeleted": false, + "boundElements": null, + "updated": 1761497535614, + "link": null, + "locked": false, + "text": "Batch -24hrs", + "fontSize": 50.74570242283038, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Batch -24hrs", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "m9MPJkKBeDEjeEG1rV8-0", + "type": "diamond", + "x": 9777.690057058631, + "y": 1884.1187414326032, + "width": 100.2881537489684, + "height": 100.2881537489684, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7u", + "roundness": { + "type": 2 + }, + "seed": 658952025, + "version": 83, + "versionNonce": 862205079, + "isDeleted": false, + "boundElements": [ + { + "id": "islAvn521qlORRHcB1OVa", + "type": "arrow" + } + ], + "updated": 1761497480215, + "link": null, + "locked": false + }, + { + "id": "6PHbgKg-nEipS2U1vlsuC", + "type": "diamond", + "x": 9777.690057058631, + "y": 1989.0821685343549, + "width": 100.2881537489684, + "height": 100.2881537489684, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7v", + "roundness": { + "type": 2 + }, + "seed": 764232345, + "version": 135, + "versionNonce": 1418676409, + "isDeleted": false, + "boundElements": [ + { + "id": "Diebh_xka0nC4hr21KpG9", + "type": "arrow" + } + ], + "updated": 1761497482778, + "link": null, + "locked": false + }, + { + "id": "LNZGqnxS3YGF8HiuFdqb1", + "type": "diamond", + "x": 9777.690057058631, + "y": 2097.035325704203, + "width": 100.2881537489684, + "height": 100.2881537489684, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7w", + "roundness": { + "type": 2 + }, + "seed": 2036887129, + "version": 194, + "versionNonce": 1475279961, + "isDeleted": false, + "boundElements": [ + { + "id": "I4amSJVTKjk0Brqq37cg9", + "type": "arrow" + } + ], + "updated": 1761497486106, + "link": null, + "locked": false + }, + { + "id": "islAvn521qlORRHcB1OVa", + "type": "arrow", + "x": 9795.579207117906, + "y": 1919.8818232572628, + "width": 498.8742879349993, + "height": 185.54012574149465, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7x", + "roundness": { + "type": 2 + }, + "seed": 712154329, + "version": 70, + "versionNonce": 205490615, + "isDeleted": false, + "boundElements": null, + "updated": 1761497480215, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -498.8742879349993, + -185.54012574149465 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "m9MPJkKBeDEjeEG1rV8-0", + "focus": 0.0475593602841068, + "gap": 1.875411150408949 + }, + "endBinding": { + "elementId": "mPw5LQcPOXemPURKsuDjO", + "focus": -0.3605948486178176, + "gap": 19.40602571213458 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Diebh_xka0nC4hr21KpG9", + "type": "arrow", + "x": 9795.747053453379, + "y": 2022.6107960180516, + "width": 497.7763040846221, + "height": 190.51260621232177, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7y", + "roundness": { + "type": 2 + }, + "seed": 992351993, + "version": 67, + "versionNonce": 1895287193, + "isDeleted": false, + "boundElements": null, + "updated": 1761497482778, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -497.7763040846221, + -190.51260621232177 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "6PHbgKg-nEipS2U1vlsuC", + "focus": 0.0864478189701057, + "gap": 1 + }, + "endBinding": { + "elementId": "5Hmn0GFjrSVoL9V1rT0by", + "focus": -0.5892059426454976, + "gap": 20.671855897984642 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "I4amSJVTKjk0Brqq37cg9", + "type": "arrow", + "x": 9817.04255726631, + "y": 2124.5354832330486, + "width": 506.26303442189237, + "height": 224.8057106283186, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7z", + "roundness": { + "type": 2 + }, + "seed": 2009958071, + "version": 45, + "versionNonce": 287691641, + "isDeleted": false, + "boundElements": null, + "updated": 1761497486106, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -506.26303442189237, + -224.8057106283186 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "LNZGqnxS3YGF8HiuFdqb1", + "focus": 0.3560126967858189, + "gap": 11.209521785325311 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "o3JRpy1kbXQalg8jg7PMw", + "type": "text", + "x": 9895.834532222912, + "y": 1918.1942342348366, + "width": 68.69288635253906, + "height": 29.831956673528637, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b80", + "roundness": null, + "seed": 1825587161, + "version": 738, + "versionNonce": 926352951, + "isDeleted": false, + "boundElements": null, + "updated": 1761497491504, + "link": null, + "locked": false, + "text": "$5/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$5/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9L2hMG7himVu6gRSdua00", + "type": "text", + "x": 9895.834532222912, + "y": 2028.4063014812457, + "width": 68.69288635253906, + "height": 29.831956673528637, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b81", + "roundness": null, + "seed": 1328091225, + "version": 764, + "versionNonce": 1609661879, + "isDeleted": false, + "boundElements": null, + "updated": 1761497492400, + "link": null, + "locked": false, + "text": "$5/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$5/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "lcXAItTX6mgTw9tbChGgh", + "type": "text", + "x": 9895.834532222912, + "y": 2132.3311793822677, + "width": 68.69288635253906, + "height": 29.831956673528637, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b82", + "roundness": null, + "seed": 525699033, + "version": 798, + "versionNonce": 947601145, + "isDeleted": false, + "boundElements": [], + "updated": 1761497492800, + "link": null, + "locked": false, + "text": "$5/hr", + "fontSize": 23.86556533882291, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "$5/hr", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "pbGsACBWbiJgrgr_8mCSS", + "type": "text", + "x": 9075.539913258513, + "y": 2165.3094320769046, + "width": 428.1492937500842, + "height": 98.2104408580201, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b83", + "roundness": null, + "seed": 1511308953, + "version": 330, + "versionNonce": 1938440697, + "isDeleted": false, + "boundElements": null, + "updated": 1761497525970, + "link": null, + "locked": false, + "text": "No batch: -$50 + $20\nBatching: -%50 + $35", + "fontSize": 39.284176343208046, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "No batch: -$50 + $20\nBatching: -%50 + $35", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "I0Bnbn_wJlbSm3ihY1sca", + "type": "arrow", + "x": 5464.75319402366, + "y": 2038.8283563675282, + "width": 223.3919651596825, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b84", + "roundness": { + "type": 2 + }, + "seed": 971460121, + "version": 90, + "versionNonce": 1988862905, + "isDeleted": false, + "boundElements": null, + "updated": 1761497659805, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 223.3919651596825, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Rof4AinbUrlm3ILjwxSYy", + "type": "text", + "x": 5701.838169041809, + "y": 2022.6445909270578, + "width": 302.66058349609375, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b85", + "roundness": null, + "seed": 1986608601, + "version": 651, + "versionNonce": 1756415129, + "isDeleted": false, + "boundElements": null, + "updated": 1761497659805, + "link": null, + "locked": false, + "text": "Summuries/documents", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Summuries/documents", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-F1Pim1BRS4S0L_pozcBB", + "type": "text", + "x": 5701.838169041809, + "y": 2079.04757802223, + "width": 256.48956298828125, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b86", + "roundness": null, + "seed": 435208377, + "version": 727, + "versionNonce": 524208505, + "isDeleted": false, + "boundElements": null, + "updated": 1761497659805, + "link": null, + "locked": false, + "text": "RAG enabled docs", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "RAG enabled docs", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GpTx7_KFNbRJk41epYq9j", + "type": "text", + "x": 5701.779356596336, + "y": 2129.2489098847223, + "width": 161.38014221191406, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b87", + "roundness": null, + "seed": 423028407, + "version": 782, + "versionNonce": 1668887129, + "isDeleted": false, + "boundElements": null, + "updated": 1761497659805, + "link": null, + "locked": false, + "text": "Embeddings", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Embeddings", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-SB4kGVMoSd0ekCDq7jzA", + "type": "arrow", + "x": 5464.75319402366, + "y": 2092.0965143629815, + "width": 223.3919651596825, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b88", + "roundness": { + "type": 2 + }, + "seed": 998860249, + "version": 138, + "versionNonce": 171147065, + "isDeleted": false, + "boundElements": null, + "updated": 1761497659805, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 223.3919651596825, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "2xt8TqPf9K5xOoOu1rpfj", + "type": "arrow", + "x": 5464.75319402366, + "y": 2141.98545463607, + "width": 223.3919651596825, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b89", + "roundness": { + "type": 2 + }, + "seed": 1106949881, + "version": 183, + "versionNonce": 30486553, + "isDeleted": false, + "boundElements": null, + "updated": 1761497659805, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 223.3919651596825, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "DHUoEfjDVQgMjmidBWopi", + "type": "arrow", + "x": 5464.563939915291, + "y": 2195.3381275282704, + "width": 223.3919651596825, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b8A", + "roundness": { + "type": 2 + }, + "seed": 639017943, + "version": 238, + "versionNonce": 541443321, + "isDeleted": false, + "boundElements": null, + "updated": 1761497659805, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 223.3919651596825, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Pwelt7v8ol3DGy4ihmj4u", + "type": "text", + "x": 5701.590102487966, + "y": 2178.1437406701243, + "width": 219.08663940429688, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b8B", + "roundness": null, + "seed": 895619319, + "version": 853, + "versionNonce": 823442905, + "isDeleted": false, + "boundElements": null, + "updated": 1761497659805, + "link": null, + "locked": false, + "text": "Synthetic Data", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Synthetic Data", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "xuXZ3UJyyEWnG_z74kQuh", + "type": "arrow", + "x": 5464.563939915291, + "y": 2248.791853087475, + "width": 223.3919651596825, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b8C", + "roundness": { + "type": 2 + }, + "seed": 135702647, + "version": 268, + "versionNonce": 1129421497, + "isDeleted": false, + "boundElements": null, + "updated": 1761497659805, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 223.3919651596825, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "bLaawYOxqCa6vC-Am3ZLG", + "type": "text", + "x": 5701.590102487966, + "y": 2231.5228671701157, + "width": 74.16494750976562, + "height": 36.41484365906022, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "li4XJZNCPpa6PWszKoIhW" + ], + "frameId": null, + "index": "b8D", + "roundness": null, + "seed": 173990457, + "version": 889, + "versionNonce": 933223321, + "isDeleted": false, + "boundElements": [], + "updated": 1761497659805, + "link": null, + "locked": false, + "text": "Evals", + "fontSize": 29.131874927248173, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Evals", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "C41atN5-V0M21XYpbVR_0", + "type": "line", + "x": 7137.308913635355, + "y": -248.50338283213637, + "width": 0, + "height": 3981.2791339724963, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8E", + "roundness": { + "type": 2 + }, + "seed": 1473070615, + "version": 115, + "versionNonce": 469923479, + "isDeleted": false, + "boundElements": null, + "updated": 1761497717501, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 3981.2791339724963 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "2N059yv_X6FAinfWbM87V", + "type": "text", + "x": 9321.184636491473, + "y": 3534.5965962347477, + "width": 776.8422722825215, + "height": 176.31801029307414, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8F", + "roundness": null, + "seed": 352849623, + "version": 995, + "versionNonce": 1439802551, + "isDeleted": false, + "boundElements": null, + "updated": 1761497867765, + "link": null, + "locked": false, + "text": "~75% performance of\nSonnet", + "fontSize": 70.52720411722966, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "~75% performance of Sonnet", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "NJtt8HcG8JcfSz5Cj49oL", + "type": "text", + "x": 10226.335374548982, + "y": 3562.4643620682455, + "width": 396.43821954814655, + "height": 88.15900514653707, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8G", + "roundness": null, + "seed": 2083943895, + "version": 1167, + "versionNonce": 1003091415, + "isDeleted": false, + "boundElements": null, + "updated": 1761497867765, + "link": null, + "locked": false, + "text": "x3 cheaper", + "fontSize": 70.52720411722966, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x3 cheaper", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "6Le_QE7vKf5JXoXmuqLON", + "type": "text", + "x": 9854.510675866311, + "y": 3760.28033431745, + "width": 298.729549962376, + "height": 88.15900514653707, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8H", + "roundness": null, + "seed": 1795848343, + "version": 1145, + "versionNonce": 484123383, + "isDeleted": false, + "boundElements": null, + "updated": 1761497867765, + "link": null, + "locked": false, + "text": "GLM 4.6", + "fontSize": 70.52720411722966, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "GLM 4.6", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "5OaVFdZAKXNog_XKa0YAf", + "type": "line", + "x": 9008.33062171739, + "y": 3289.5431760071106, + "width": 1857.095947265625, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8I", + "roundness": { + "type": 2 + }, + "seed": 1820288343, + "version": 44, + "versionNonce": 221092537, + "isDeleted": false, + "boundElements": null, + "updated": 1761497854344, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1857.095947265625, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "CWVwkAbSyDmlr2YXNu8zO", + "type": "text", + "x": 1191.4337215404023, + "y": 4781.295863548556, + "width": 2606.84130859375, + "height": 472.49841292706157, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8J", + "roundness": null, + "seed": 853558617, + "version": 1161, + "versionNonce": 1580242679, + "isDeleted": false, + "boundElements": [ + { + "id": "ON8MSIGxajLGYTsCqjnyN", + "type": "arrow" + } + ], + "updated": 1761497971029, + "link": null, + "locked": false, + "text": "For each Input Modality:\n- Total Tokens, Cached Tokens\n- Uncached Tokens = Total Input Tokens [Modality] - Total Cached Input Tokens\n- Uncached Tokens Cost = Uncached Tokens * Base Input Pricing\n- Cached Toekns Cost = Cached Token s* Cached Input Price\n- Sum ALL input modalities = Total Input Cost", + "fontSize": 62.99978839027487, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "For each Input Modality:\n- Total Tokens, Cached Tokens\n- Uncached Tokens = Total Input Tokens [Modality] - Total Cached Input Tokens\n- Uncached Tokens Cost = Uncached Tokens * Base Input Pricing\n- Cached Toekns Cost = Cached Token s* Cached Input Price\n- Sum ALL input modalities = Total Input Cost", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "plEMYt6MMSDqw5Ds4mc_k", + "type": "text", + "x": 1191.6525496763288, + "y": 5349.428206245396, + "width": 2041.3170166015625, + "height": 393.748677439218, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8K", + "roundness": null, + "seed": 2069305017, + "version": 1368, + "versionNonce": 333711737, + "isDeleted": false, + "boundElements": [ + { + "id": "ON8MSIGxajLGYTsCqjnyN", + "type": "arrow" + } + ], + "updated": 1761498013722, + "link": null, + "locked": false, + "text": "For each Output Modality:\n- Total Tokens * Output Pricing = Output Cost for that modality\n- SUM ALL output modalities = Total Output Cost\n\n- Total Cost = Total Input Cost + Total Output Cost", + "fontSize": 62.99978839027487, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "For each Output Modality:\n- Total Tokens * Output Pricing = Output Cost for that modality\n- SUM ALL output modalities = Total Output Cost\n\n- Total Cost = Total Input Cost + Total Output Cost", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/Week15/Day1/image.ipynb b/Week15/Day1/image.ipynb new file mode 100644 index 00000000..52d74377 --- /dev/null +++ b/Week15/Day1/image.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "715aabfc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "304.72266666666667\n" + ] + } + ], + "source": [ + "import base64\n", + "import httpx\n", + "\n", + "image_url = \"https://i.redd.it/1267kk74qmhf1.png\"\n", + "image_media_type = \"image/png\"\n", + "image_data = base64.b64encode(httpx.get(image_url).content).decode(\"utf-8\")\n", + "\n", + "dimensions = \"458 × 499\"\n", + "\n", + "\n", + "estimated_tokens = (458 * 499) / 750 # Source: https://docs.anthropic.com/en/docs/build-with-claude/vision\n", + "\n", + "print(estimated_tokens)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "eff25502", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Message(id='msg_01NrLYS25poKodkmgg9ofJsc', content=[TextBlock(citations=None, text='This image shows a bar chart titled \"Academic\" that presents performance data for software engineering problems from the SWE-bench Verified dataset. The chart compares accuracy scores (as percentages on the y-axis) across three different AI models:\\n\\n1. **GPT-5**: Shows the highest performance with 74.9% accuracy, with the bar divided into two sections - \"Without thinking\" (52.8%) and \"With thinking\" (an additional portion that brings the total to 74.9%)\\n\\n2. **OpenAI o3**: Achieves 69.1% accuracy (shown as a light-colored bar)\\n\\n3. **GPT-4o**: Has the lowest performance at 30.8% accuracy (also shown as a light-colored bar)\\n\\nThe chart uses a pink/magenta color scheme to distinguish between different thinking approaches for GPT-5, while the other models are shown in lighter colors. This appears to be measuring how well these AI models can solve software engineering problems, with GPT-5 demonstrating significantly better performance, especially when using some form of enhanced reasoning approach.', type='text')], model='claude-sonnet-4-20250514', role='assistant', stop_reason='end_turn', stop_sequence=None, type='message', usage=Usage(cache_creation_input_tokens=0, cache_read_input_tokens=0, input_tokens=322, output_tokens=241, server_tool_use=None, service_tier='standard'))\n", + "Usage(cache_creation_input_tokens=0, cache_read_input_tokens=0, input_tokens=322, output_tokens=241, server_tool_use=None, service_tier='standard')\n", + "322\n", + "241\n", + "====\n", + "This image shows a bar chart titled \"Academic\" that presents performance data for software engineering problems from the SWE-bench Verified dataset. The chart compares accuracy scores (as percentages on the y-axis) across three different AI models:\n", + "\n", + "1. **GPT-5**: Shows the highest performance with 74.9% accuracy, with the bar divided into two sections - \"Without thinking\" (52.8%) and \"With thinking\" (an additional portion that brings the total to 74.9%)\n", + "\n", + "2. **OpenAI o3**: Achieves 69.1% accuracy (shown as a light-colored bar)\n", + "\n", + "3. **GPT-4o**: Has the lowest performance at 30.8% accuracy (also shown as a light-colored bar)\n", + "\n", + "The chart uses a pink/magenta color scheme to distinguish between different thinking approaches for GPT-5, while the other models are shown in lighter colors. This appears to be measuring how well these AI models can solve software engineering problems, with GPT-5 demonstrating significantly better performance, especially when using some form of enhanced reasoning approach.\n" + ] + } + ], + "source": [ + "import anthropic\n", + "\n", + "client = anthropic.Anthropic()\n", + "message = client.messages.create(\n", + " model=\"claude-sonnet-4-20250514\",\n", + " max_tokens=1024,\n", + " messages=[\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"image\",\n", + " \"source\": {\n", + " \"type\": \"base64\",\n", + " \"media_type\": image_media_type,\n", + " \"data\": image_data,\n", + " },\n", + " },\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": \"Describe this image.\"\n", + " }\n", + " ],\n", + " }\n", + " ],\n", + ")\n", + "print(message)\n", + "print(message.usage)\n", + "print(message.usage.input_tokens)\n", + "print(message.usage.output_tokens)\n", + "print(\"====\")\n", + "print(message.content[0].text)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Week15/Day1/predicted_output.ipynb b/Week15/Day1/predicted_output.ipynb new file mode 100644 index 00000000..b8514e40 --- /dev/null +++ b/Week15/Day1/predicted_output.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "26376275", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'role': 'system', 'content': 'You are a helpful assistant.'}, {'role': 'user', 'content': 'What is the capital of France?'}]\n" + ] + } + ], + "source": [ + "messages= [{ \"role\": \"system\", \"content\": \"You are a helpful assistant.\" }, \n", + " { \"role\": \"user\", \"content\": \"What is the capital of France?\" }]\n", + "\n", + "print(messages)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "94063e4f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ChatCompletion(id='chatcmpl-C2UBZW9wAh1iPzlx2zU4Z1jdZSATg', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='The capital of France is Paris.', refusal=None, role='assistant', annotations=[], audio=None, function_call=None, tool_calls=None))], created=1754708725, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier='default', system_fingerprint='fp_34a54ae93c', usage=CompletionUsage(completion_tokens=7, prompt_tokens=24, total_tokens=31, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=7, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))\n", + "CompletionUsage(completion_tokens=7, prompt_tokens=24, total_tokens=31, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=7, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0))\n", + "================\n", + "Total tokens:\n", + "31\n", + "Prompt tokens: (Input Tokens)\n", + "24\n", + "Cached Prompt Tokens:\n", + "0\n", + "Completion Tokens: (Output Tokens)\n", + "================\n", + "Accepted Prediction Tokens: 7\n", + "Rejected Prediction Tokens: 0\n", + "================\n", + "7\n", + "The capital of France is Paris.\n" + ] + } + ], + "source": [ + "# CHat completion openai call to get a response for messages\n", + "\n", + "import os\n", + "from openai import OpenAI\n", + "from dotenv import load_dotenv\n", + "\n", + "load_dotenv()\n", + "\n", + "client = OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"))\n", + "\n", + "\n", + "#Chat Completion\n", + "response = client.chat.completions.create(\n", + " model=\"gpt-4o-mini\",\n", + " messages=messages,\n", + " max_tokens=50,\n", + " prediction={\n", + " \"type\": \"content\",\n", + " \"content\": \"The capital of France is Paris.\" # This could be generated by a cheaper LLM\n", + " }\n", + ")\n", + "\n", + "\n", + "print(response)\n", + "print(response.usage)\n", + "print(\"================\")\n", + "print(\"Total tokens:\")\n", + "print(response.usage.total_tokens)\n", + "print(\"Prompt tokens: (Input Tokens)\")\n", + "print(response.usage.prompt_tokens)\n", + "print(\"Cached Prompt Tokens:\")\n", + "print(response.usage.prompt_tokens_details.cached_tokens)\n", + "print(\"Completion Tokens: (Output Tokens)\")\n", + "print(\"================\")\n", + "print(\"Accepted Prediction Tokens: \", response.usage.completion_tokens_details.accepted_prediction_tokens)\n", + "print(\"Rejected Prediction Tokens: \", response.usage.completion_tokens_details.rejected_prediction_tokens)\n", + "print(\"================\")\n", + "print(response.usage.completion_tokens)\n", + "print(response.choices[0].message.content)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Week15/Day1/tokens.ipynb b/Week15/Day1/tokens.ipynb new file mode 100644 index 00000000..c7c50d3f --- /dev/null +++ b/Week15/Day1/tokens.ipynb @@ -0,0 +1,699 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "72913b3f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: openai in ./.venv/lib/python3.11/site-packages (1.99.4)\n", + "Requirement already satisfied: tiktoken in ./.venv/lib/python3.11/site-packages (0.10.0)\n", + "Requirement already satisfied: anthropic in ./.venv/lib/python3.11/site-packages (0.62.0)\n", + "Requirement already satisfied: python-dotenv in ./.venv/lib/python3.11/site-packages (1.1.1)\n", + "Requirement already satisfied: google-genai in ./.venv/lib/python3.11/site-packages (1.29.0)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in ./.venv/lib/python3.11/site-packages (from openai) (4.10.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in ./.venv/lib/python3.11/site-packages (from openai) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in ./.venv/lib/python3.11/site-packages (from openai) (0.28.1)\n", + "Requirement already satisfied: jiter<1,>=0.4.0 in ./.venv/lib/python3.11/site-packages (from openai) (0.10.0)\n", + "Requirement already satisfied: pydantic<3,>=1.9.0 in ./.venv/lib/python3.11/site-packages (from openai) (2.11.7)\n", + "Requirement already satisfied: sniffio in ./.venv/lib/python3.11/site-packages (from openai) (1.3.1)\n", + "Requirement already satisfied: tqdm>4 in ./.venv/lib/python3.11/site-packages (from openai) (4.67.1)\n", + "Requirement already satisfied: typing-extensions<5,>=4.11 in ./.venv/lib/python3.11/site-packages (from openai) (4.14.1)\n", + "Requirement already satisfied: regex>=2022.1.18 in ./.venv/lib/python3.11/site-packages (from tiktoken) (2025.7.34)\n", + "Requirement already satisfied: requests>=2.26.0 in ./.venv/lib/python3.11/site-packages (from tiktoken) (2.32.4)\n", + "Requirement already satisfied: google-auth<3.0.0,>=2.14.1 in ./.venv/lib/python3.11/site-packages (from google-genai) (2.40.3)\n", + "Requirement already satisfied: tenacity<9.2.0,>=8.2.3 in ./.venv/lib/python3.11/site-packages (from google-genai) (9.1.2)\n", + "Requirement already satisfied: websockets<15.1.0,>=13.0.0 in ./.venv/lib/python3.11/site-packages (from google-genai) (15.0.1)\n", + "Requirement already satisfied: idna>=2.8 in ./.venv/lib/python3.11/site-packages (from anyio<5,>=3.5.0->openai) (3.10)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in ./.venv/lib/python3.11/site-packages (from google-auth<3.0.0,>=2.14.1->google-genai) (5.5.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in ./.venv/lib/python3.11/site-packages (from google-auth<3.0.0,>=2.14.1->google-genai) (0.4.2)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in ./.venv/lib/python3.11/site-packages (from google-auth<3.0.0,>=2.14.1->google-genai) (4.9.1)\n", + "Requirement already satisfied: certifi in ./.venv/lib/python3.11/site-packages (from httpx<1,>=0.23.0->openai) (2025.8.3)\n", + "Requirement already satisfied: httpcore==1.* in ./.venv/lib/python3.11/site-packages (from httpx<1,>=0.23.0->openai) (1.0.9)\n", + "Requirement already satisfied: h11>=0.16 in ./.venv/lib/python3.11/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai) (0.16.0)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in ./.venv/lib/python3.11/site-packages (from pydantic<3,>=1.9.0->openai) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.33.2 in ./.venv/lib/python3.11/site-packages (from pydantic<3,>=1.9.0->openai) (2.33.2)\n", + "Requirement already satisfied: typing-inspection>=0.4.0 in ./.venv/lib/python3.11/site-packages (from pydantic<3,>=1.9.0->openai) (0.4.1)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in ./.venv/lib/python3.11/site-packages (from requests>=2.26.0->tiktoken) (3.4.2)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in ./.venv/lib/python3.11/site-packages (from requests>=2.26.0->tiktoken) (2.5.0)\n", + "Requirement already satisfied: pyasn1<0.7.0,>=0.6.1 in ./.venv/lib/python3.11/site-packages (from pyasn1-modules>=0.2.1->google-auth<3.0.0,>=2.14.1->google-genai) (0.6.1)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install openai tiktoken anthropic python-dotenv google-genai" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "88175fdb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'role': 'system', 'content': 'You are a helpful assistant. Answer in crisp & friendly language. If any additional information is needed, ask the user for it before your answer.'}, {'role': 'user', 'content': 'What is the capital of France?'}, {'role': 'assistant', 'content': 'The capital of France is Paris.'}, {'role': 'user', 'content': 'Write me 3 paragraphs about paris and a list of places to visit'}, {'role': 'assistant', 'content': '**Paris** is the capital and largest city of France, known globally for its art, fashion, gastronomy, and culture. Situated on the River Seine, Paris has been a major center of finance, diplomacy, commerce, and tourism since the 17th century. Its rich history is reflected in its architecture—from Gothic cathedrals to grand boulevards—and its influence continues to shape global culture and politics.\\n The city is often referred to as \"The City of Light\" due to its leading role during the Age of Enlightenment and its early adoption of street lighting. Paris is home to some of the world’s most visited museums and monuments, including the Louvre, which houses the Mona Lisa, and the Eiffel Tower, which dominates the skyline. Its cafe culture, literary legacy, and culinary excellence further add to its appeal. \\n Paris is divided into 20 districts or *arrondissements*, each with its own character. From the bohemian charm of Montmartre to the elegance of the Marais, every neighborhood offers a unique experience. Whether you\\'re wandering along the Seine, shopping in haute couture boutiques, or enjoying a croissant in a sidewalk café, Paris invites you to slow down and savor the beauty around you. \\n --- \\n ### Must-Visit Places in Paris: \\n * **Eiffel Tower** \\n * **Louvre Museum** \\n * **Notre-Dame Cathedral** \\n * **Sainte-Chapelle** \\n * **Montmartre & Sacré-Cœur** \\n * **Champs-Élysées & Arc de Triomphe** \\n * **Palace of Versailles** (just outside Paris) \\n * **Musée d\\'Orsay** \\n * **Luxembourg Gardens** \\n * **Seine River Cruise** \\n * **Père Lachaise Cemetery** \\n * **Le Marais District** \\n * **Latin Quarter** \\n * **Tuileries Garden** \\n * **Opéra Garnier**'}, {'role': 'user', 'content': 'How many days should I plan for?'}]\n", + "[{'role': 'user', 'content': 'What is the capital of France?'}, {'role': 'assistant', 'content': 'The capital of France is Paris.'}, {'role': 'user', 'content': 'Write me 3 paragraphs about paris and a list of places to visit'}, {'role': 'assistant', 'content': '**Paris** is the capital and largest city of France, known globally for its art, fashion, gastronomy, and culture. Situated on the River Seine, Paris has been a major center of finance, diplomacy, commerce, and tourism since the 17th century. Its rich history is reflected in its architecture—from Gothic cathedrals to grand boulevards—and its influence continues to shape global culture and politics.\\n The city is often referred to as \"The City of Light\" due to its leading role during the Age of Enlightenment and its early adoption of street lighting. Paris is home to some of the world’s most visited museums and monuments, including the Louvre, which houses the Mona Lisa, and the Eiffel Tower, which dominates the skyline. Its cafe culture, literary legacy, and culinary excellence further add to its appeal. \\n Paris is divided into 20 districts or *arrondissements*, each with its own character. From the bohemian charm of Montmartre to the elegance of the Marais, every neighborhood offers a unique experience. Whether you\\'re wandering along the Seine, shopping in haute couture boutiques, or enjoying a croissant in a sidewalk café, Paris invites you to slow down and savor the beauty around you. \\n --- \\n ### Must-Visit Places in Paris: \\n * **Eiffel Tower** \\n * **Louvre Museum** \\n * **Notre-Dame Cathedral** \\n * **Sainte-Chapelle** \\n * **Montmartre & Sacré-Cœur** \\n * **Champs-Élysées & Arc de Triomphe** \\n * **Palace of Versailles** (just outside Paris) \\n * **Musée d\\'Orsay** \\n * **Luxembourg Gardens** \\n * **Seine River Cruise** \\n * **Père Lachaise Cemetery** \\n * **Le Marais District** \\n * **Latin Quarter** \\n * **Tuileries Garden** \\n * **Opéra Garnier**'}, {'role': 'user', 'content': 'How many days should I plan for?'}]\n", + "[{'role': 'system', 'content': 'You are a professional, friendly, and detail-oriented travel assistant and booking agent. Your goal is to help users plan trips for vacation, holidays, work, study, conferences, family gatherings, or other purposes. Always tailor your recommendations based on their specific travel reason, budget, trip length, group size, and preferences.\\n\\n## Core Behaviour & Guidelines\\n1. Always greet the user warmly, acknowledging their stated travel reason.\\n2. Ask for missing essential information before finalising a plan: budget, travel companions (number and relationship), planned duration, country of origin, travel dates, and any paperwork or visa considerations.\\n3. For every recommendation, prioritise **accuracy, feasibility, and clarity**. Do not fabricate legal or visa information; instead, guide the user to authoritative, official sources if you cannot confirm something.\\n4. Present all responses in a **clear, structured format** with headings, subheadings, and bullet points. Avoid long unbroken paragraphs.\\n5. Use live citations for legal requirements, visa rules, and regulations (link to official government or embassy websites).\\n6. Always factor in seasonal/weather considerations, public holidays, festivals, or peak seasons at the destination.\\n7. Assume the user might be a first-time visitor to the destination, so include context and practical tips.\\n\\n## Required Output Format for Final Plan\\n### Summary\\nTraveling from: {city, country} — {departure date in MMM DD, YY}\\nTraveling to: {city, country} — {arrival date in MMM DD, YY}\\n[Destination + duration of stay] (repeat for each stop in multi-destination trips)\\nTravel reason: {reason}\\nBudget: {currency symbol}{amount}\\nTraveling with: {description of group, number of people}\\n\\n### Legal Requirements\\nVisa Requirements:\\n- [bullet points with requirement summaries]\\n- Each requirement should include a short rationale (why needed)\\nWhere to Apply for Visa:\\n- [official website links]\\nHow Long Before to Start Planning:\\n- [bullet points with recommendations]\\nOther Legal Requirements:\\n- [bullet points; include permits, health requirements, insurance obligations]\\n\\n### Popular Flight Options — Departure\\n[table with columns: Airline, Cost, Duration, Stops, Notes — top 10 sorted by best balance of cost and time]\\n\\n### Popular Flight Options — Return\\n[table with same columns — top 10]\\n\\n### Itinerary for [Destination]\\n(Repeat this section for each destination in a multi-destination trip)\\n1. Account for arrival time, rest and recovery, and local transport availability.\\n2. Ensure key attractions or events have enough allocated time.\\n3. Add seasonal or holiday-specific adjustments.\\n4. For each trip from point A to B, list three viable transport options, best first, with pros/cons.\\n5. Where applicable, include unique, lesser-known experiences.\\n6. Mention potential risks (weather, strikes, closures).\\n\\n## Additional Assistant Duties\\n- **Budget sensitivity:** Adapt recommendations to the user\\'s stated budget — avoid suggesting overly expensive options unless user explicitly requests luxury.\\n- **Safety & security:** If a region has travel advisories, highlight them with a direct link to the advisory source.\\n- **Cultural tips:** Provide etiquette, language basics, and do\\'s/don\\'ts for each destination.\\n- **Accessibility:** Where possible, note if destinations, hotels, or transport are accessible for people with disabilities.\\n- **Food & dining:** Suggest must-try local dishes and safe eating practices.\\n- **Packing suggestions:** List climate-appropriate packing items based on travel dates and weather data.\\n- **Connectivity:** Include info on SIM cards, eSIMs, and Wi-Fi availability.\\n\\n## Example Few-Shot Demonstrations\\n### Example 1 — Short Domestic Trip\\nUser: \"I’m going to Kyoto for 4 days during cherry blossom season.\"\\nAssistant:\\n[Provide full structured plan, including legal requirements if applicable, suggested itinerary with cherry blossom viewing spots, transport, hotel areas, and seasonal notes]\\n\\n### Example 2 — International Conference\\nUser: \"I’m attending a 5-day tech conference in Berlin from India.\"\\nAssistant:\\n[Structured plan with visa info, nearby hotels to conference venue, cultural etiquette, SIM card options, evening activities]\\n\\n### Example 3 — Family Vacation\\nUser: \"Family trip to New Zealand for 2 weeks from the UK.\"\\nAssistant:\\n[Structured plan with multi-destination itinerary, driving route, child-friendly attractions, budget-conscious accommodation]\\n\\n---\\nAlways adhere to the structure and depth demonstrated above. Do not skip sections unless the user explicitly instructs otherwise. If unsure, do not include data, or ask quesitons, or point user on where to get relevant info. Do not give information you are yourself not sure about. If tools are not available like websearch, etc. — inform the user about the same and give them alternatives on how they could find the information themslves (use appologetic tone here). For most chit, chats —\\xa0keep the answers super crisp. Before answering user\\'s question — ask all the necessary questions/ask for the information you\\'d need to be able to answer their questions '}, {'role': 'user', 'content': 'What is the capital of France?'}, {'role': 'assistant', 'content': 'The capital of France is Paris.'}, {'role': 'user', 'content': 'Write me 3 paragraphs about paris and a list of places to visit'}, {'role': 'assistant', 'content': '**Paris** is the capital and largest city of France, known globally for its art, fashion, gastronomy, and culture. Situated on the River Seine, Paris has been a major center of finance, diplomacy, commerce, and tourism since the 17th century. Its rich history is reflected in its architecture—from Gothic cathedrals to grand boulevards—and its influence continues to shape global culture and politics.\\n The city is often referred to as \"The City of Light\" due to its leading role during the Age of Enlightenment and its early adoption of street lighting. Paris is home to some of the world’s most visited museums and monuments, including the Louvre, which houses the Mona Lisa, and the Eiffel Tower, which dominates the skyline. Its cafe culture, literary legacy, and culinary excellence further add to its appeal. \\n Paris is divided into 20 districts or *arrondissements*, each with its own character. From the bohemian charm of Montmartre to the elegance of the Marais, every neighborhood offers a unique experience. Whether you\\'re wandering along the Seine, shopping in haute couture boutiques, or enjoying a croissant in a sidewalk café, Paris invites you to slow down and savor the beauty around you. \\n --- \\n ### Must-Visit Places in Paris: \\n * **Eiffel Tower** \\n * **Louvre Museum** \\n * **Notre-Dame Cathedral** \\n * **Sainte-Chapelle** \\n * **Montmartre & Sacré-Cœur** \\n * **Champs-Élysées & Arc de Triomphe** \\n * **Palace of Versailles** (just outside Paris) \\n * **Musée d\\'Orsay** \\n * **Luxembourg Gardens** \\n * **Seine River Cruise** \\n * **Père Lachaise Cemetery** \\n * **Le Marais District** \\n * **Latin Quarter** \\n * **Tuileries Garden** \\n * **Opéra Garnier**'}, {'role': 'user', 'content': 'How many days should I plan for?'}]\n" + ] + } + ], + "source": [ + "messages = [{ \"role\": \"system\", \"content\": \"You are a helpful assistant. Answer in crisp & friendly language. If any additional information is needed, ask the user for it before your answer.\" },\n", + " { \"role\": \"user\", \"content\": \"What is the capital of France?\" },\n", + " { \"role\": \"assistant\", \"content\": \"The capital of France is Paris.\" },\n", + " { \"role\": \"user\", \"content\": \"Write me 3 paragraphs about paris and a list of places to visit\" },\n", + " { \"role\": \"assistant\", \"content\": \"**Paris** is the capital and largest city of France, known globally for its art, fashion, gastronomy, and culture. Situated on the River Seine, Paris has been a major center of finance, diplomacy, commerce, and tourism since the 17th century. Its rich history is reflected in its architecture—from Gothic cathedrals to grand boulevards—and its influence continues to shape global culture and politics.\\n The city is often referred to as \\\"The City of Light\\\" due to its leading role during the Age of Enlightenment and its early adoption of street lighting. Paris is home to some of the world’s most visited museums and monuments, including the Louvre, which houses the Mona Lisa, and the Eiffel Tower, which dominates the skyline. Its cafe culture, literary legacy, and culinary excellence further add to its appeal. \\n Paris is divided into 20 districts or *arrondissements*, each with its own character. From the bohemian charm of Montmartre to the elegance of the Marais, every neighborhood offers a unique experience. Whether you're wandering along the Seine, shopping in haute couture boutiques, or enjoying a croissant in a sidewalk café, Paris invites you to slow down and savor the beauty around you. \\n --- \\n ### Must-Visit Places in Paris: \\n * **Eiffel Tower** \\n * **Louvre Museum** \\n * **Notre-Dame Cathedral** \\n * **Sainte-Chapelle** \\n * **Montmartre & Sacré-Cœur** \\n * **Champs-Élysées & Arc de Triomphe** \\n * **Palace of Versailles** (just outside Paris) \\n * **Musée d'Orsay** \\n * **Luxembourg Gardens** \\n * **Seine River Cruise** \\n * **Père Lachaise Cemetery** \\n * **Le Marais District** \\n * **Latin Quarter** \\n * **Tuileries Garden** \\n * **Opéra Garnier**\" },\n", + " { \"role\": \"user\", \"content\": \"How many days should I plan for?\" },\n", + "]\n", + "\n", + "\n", + "messages_2 = [\n", + " { \"role\": \"system\", \"content\": \"You are a professional, friendly, and detail-oriented travel assistant and booking agent. Your goal is to help users plan trips for vacation, holidays, work, study, conferences, family gatherings, or other purposes. Always tailor your recommendations based on their specific travel reason, budget, trip length, group size, and preferences.\\n\\n## Core Behaviour & Guidelines\\n1. Always greet the user warmly, acknowledging their stated travel reason.\\n2. Ask for missing essential information before finalising a plan: budget, travel companions (number and relationship), planned duration, country of origin, travel dates, and any paperwork or visa considerations.\\n3. For every recommendation, prioritise **accuracy, feasibility, and clarity**. Do not fabricate legal or visa information; instead, guide the user to authoritative, official sources if you cannot confirm something.\\n4. Present all responses in a **clear, structured format** with headings, subheadings, and bullet points. Avoid long unbroken paragraphs.\\n5. Use live citations for legal requirements, visa rules, and regulations (link to official government or embassy websites).\\n6. Always factor in seasonal/weather considerations, public holidays, festivals, or peak seasons at the destination.\\n7. Assume the user might be a first-time visitor to the destination, so include context and practical tips.\\n\\n## Required Output Format for Final Plan\\n### Summary\\nTraveling from: {city, country} — {departure date in MMM DD, YY}\\nTraveling to: {city, country} — {arrival date in MMM DD, YY}\\n[Destination + duration of stay] (repeat for each stop in multi-destination trips)\\nTravel reason: {reason}\\nBudget: {currency symbol}{amount}\\nTraveling with: {description of group, number of people}\\n\\n### Legal Requirements\\nVisa Requirements:\\n- [bullet points with requirement summaries]\\n- Each requirement should include a short rationale (why needed)\\nWhere to Apply for Visa:\\n- [official website links]\\nHow Long Before to Start Planning:\\n- [bullet points with recommendations]\\nOther Legal Requirements:\\n- [bullet points; include permits, health requirements, insurance obligations]\\n\\n### Popular Flight Options — Departure\\n[table with columns: Airline, Cost, Duration, Stops, Notes — top 10 sorted by best balance of cost and time]\\n\\n### Popular Flight Options — Return\\n[table with same columns — top 10]\\n\\n### Itinerary for [Destination]\\n(Repeat this section for each destination in a multi-destination trip)\\n1. Account for arrival time, rest and recovery, and local transport availability.\\n2. Ensure key attractions or events have enough allocated time.\\n3. Add seasonal or holiday-specific adjustments.\\n4. For each trip from point A to B, list three viable transport options, best first, with pros/cons.\\n5. Where applicable, include unique, lesser-known experiences.\\n6. Mention potential risks (weather, strikes, closures).\\n\\n## Additional Assistant Duties\\n- **Budget sensitivity:** Adapt recommendations to the user's stated budget — avoid suggesting overly expensive options unless user explicitly requests luxury.\\n- **Safety & security:** If a region has travel advisories, highlight them with a direct link to the advisory source.\\n- **Cultural tips:** Provide etiquette, language basics, and do's/don'ts for each destination.\\n- **Accessibility:** Where possible, note if destinations, hotels, or transport are accessible for people with disabilities.\\n- **Food & dining:** Suggest must-try local dishes and safe eating practices.\\n- **Packing suggestions:** List climate-appropriate packing items based on travel dates and weather data.\\n- **Connectivity:** Include info on SIM cards, eSIMs, and Wi-Fi availability.\\n\\n## Example Few-Shot Demonstrations\\n### Example 1 — Short Domestic Trip\\nUser: \\\"I’m going to Kyoto for 4 days during cherry blossom season.\\\"\\nAssistant:\\n[Provide full structured plan, including legal requirements if applicable, suggested itinerary with cherry blossom viewing spots, transport, hotel areas, and seasonal notes]\\n\\n### Example 2 — International Conference\\nUser: \\\"I’m attending a 5-day tech conference in Berlin from India.\\\"\\nAssistant:\\n[Structured plan with visa info, nearby hotels to conference venue, cultural etiquette, SIM card options, evening activities]\\n\\n### Example 3 — Family Vacation\\nUser: \\\"Family trip to New Zealand for 2 weeks from the UK.\\\"\\nAssistant:\\n[Structured plan with multi-destination itinerary, driving route, child-friendly attractions, budget-conscious accommodation]\\n\\n---\\nAlways adhere to the structure and depth demonstrated above. Do not skip sections unless the user explicitly instructs otherwise. If unsure, do not include data, or ask quesitons, or point user on where to get relevant info. Do not give information you are yourself not sure about. If tools are not available like websearch, etc. — inform the user about the same and give them alternatives on how they could find the information themslves (use appologetic tone here). For most chit, chats — keep the answers super crisp. Before answering user's question — ask all the necessary questions/ask for the information you'd need to be able to answer their questions \"},\n", + " { \"role\": \"user\", \"content\": \"What is the capital of France?\" },\n", + " { \"role\": \"assistant\", \"content\": \"The capital of France is Paris.\" },\n", + " { \"role\": \"user\", \"content\": \"Write me 3 paragraphs about paris and a list of places to visit\" },\n", + " { \"role\": \"assistant\", \"content\": \"**Paris** is the capital and largest city of France, known globally for its art, fashion, gastronomy, and culture. Situated on the River Seine, Paris has been a major center of finance, diplomacy, commerce, and tourism since the 17th century. Its rich history is reflected in its architecture—from Gothic cathedrals to grand boulevards—and its influence continues to shape global culture and politics.\\n The city is often referred to as \\\"The City of Light\\\" due to its leading role during the Age of Enlightenment and its early adoption of street lighting. Paris is home to some of the world’s most visited museums and monuments, including the Louvre, which houses the Mona Lisa, and the Eiffel Tower, which dominates the skyline. Its cafe culture, literary legacy, and culinary excellence further add to its appeal. \\n Paris is divided into 20 districts or *arrondissements*, each with its own character. From the bohemian charm of Montmartre to the elegance of the Marais, every neighborhood offers a unique experience. Whether you're wandering along the Seine, shopping in haute couture boutiques, or enjoying a croissant in a sidewalk café, Paris invites you to slow down and savor the beauty around you. \\n --- \\n ### Must-Visit Places in Paris: \\n * **Eiffel Tower** \\n * **Louvre Museum** \\n * **Notre-Dame Cathedral** \\n * **Sainte-Chapelle** \\n * **Montmartre & Sacré-Cœur** \\n * **Champs-Élysées & Arc de Triomphe** \\n * **Palace of Versailles** (just outside Paris) \\n * **Musée d'Orsay** \\n * **Luxembourg Gardens** \\n * **Seine River Cruise** \\n * **Père Lachaise Cemetery** \\n * **Le Marais District** \\n * **Latin Quarter** \\n * **Tuileries Garden** \\n * **Opéra Garnier**\" },\n", + " { \"role\": \"user\", \"content\": \"How many days should I plan for?\" },\n", + "]\n", + "\n", + "print(messages)\n", + "print(messages[1:])\n", + "print(messages_2)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a1e1e12c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Message 1\n", + "Tokens: [58, 40200, 8716, 2337, 461, 17360, 787, 461, 3252, 2337, 461, 3575, 553, 261, 10297, 29186, 13, 30985, 306, 52647, 827, 11888, 6439, 13, 1843, 1062, 6623, 2164, 382, 6118, 11, 3810, 290, 1825, 395, 480, 2254, 634, 6052, 8856, 4180, 11881, 8716, 2337, 461, 1428, 787, 461, 3252, 2337, 461, 4827, 382, 290, 9029, 328, 10128, 48511, 4180, 11881, 8716, 2337, 461, 173781, 787, 461, 3252, 2337, 461, 976, 9029, 328, 10128, 382, 12650, 8856, 4180, 11881, 8716, 2337, 461, 1428, 787, 461, 3252, 2337, 461, 10930, 668, 220, 18, 77584, 1078, 55530, 326, 261, 1562, 328, 9610, 316, 4030, 59350, 11881, 8716, 2337, 461, 173781, 787, 461, 3252, 2337, 188301, 72782, 410, 382, 290, 9029, 326, 10574, 5030, 328, 10128, 11, 5542, 43727, 395, 1617, 1957, 11, 12808, 11, 41185, 29775, 11, 326, 9674, 13, 139431, 402, 290, 13728, 74722, 11, 12650, 853, 1339, 261, 5035, 6170, 328, 17496, 11, 140888, 11, 41881, 11, 326, 40944, 3630, 290, 220, 1422, 404, 14015, 13, 13974, 10358, 5678, 382, 45264, 306, 1617, 24022, 178328, 81461, 9059, 1736, 81, 1288, 316, 6363, 17573, 3944, 3098, 35251, 1617, 16044, 15093, 316, 9591, 5466, 9674, 326, 23118, 15043, 77, 623, 5030, 382, 4783, 22653, 316, 472, 392, 976, 5686, 328, 12936, 1, 5192, 316, 1617, 8117, 5430, 3354, 290, 21108, 328, 159801, 100506, 326, 1617, 6047, 36227, 328, 12901, 21787, 13, 12650, 382, 2237, 316, 1236, 328, 290, 2375, 802, 1645, 18416, 62888, 326, 91876, 11, 3463, 290, 168662, 11, 1118, 20327, 290, 135869, 44225, 11, 326, 290, 155511, 37994, 11, 1118, 168430, 290, 138561, 13, 13974, 50672, 9674, 11, 44015, 33304, 11, 326, 69119, 38794, 6544, 1147, 316, 1617, 21446, 13, 2381, 77, 12650, 382, 28261, 1511, 220, 455, 46334, 503, 425, 1614, 1415, 55898, 24077, 2454, 483, 1617, 2316, 5855, 13, 7217, 290, 1581, 128787, 33606, 328, 11992, 30028, 264, 316, 290, 65179, 328, 290, 3145, 1873, 11, 1753, 17528, 5297, 261, 5746, 3240, 13, 14959, 481, 19780, 264, 95286, 4251, 290, 74722, 11, 11606, 306, 49646, 139344, 108274, 11, 503, 24602, 261, 11270, 31359, 306, 261, 78208, 30469, 11, 12650, 59228, 481, 316, 9800, 1917, 326, 156553, 290, 14505, 2846, 481, 13, 2381, 77, 26691, 2381, 77, 37633, 20953, 12, 30514, 61128, 306, 12650, 25, 2381, 77, 425, 6240, 36, 129338, 37994, 410, 2381, 77, 425, 6240, 43, 81331, 17982, 410, 2381, 77, 425, 6240, 71851, 190700, 73752, 410, 2381, 77, 425, 6240, 50, 48434, 40468, 403, 3486, 410, 2381, 77, 425, 6240, 46920, 30028, 264, 827, 31575, 22830, 10050, 38909, 410, 2381, 77, 425, 6240, 1205, 13580, 12, 5859, 37543, 5161, 827, 34470, 334, 25062, 23036, 273, 410, 2381, 77, 425, 6240, 16476, 675, 328, 138349, 410, 350, 5283, 7539, 12650, 8, 2381, 77, 425, 6240, 48816, 2894, 272, 19780, 2251, 64494, 410, 2381, 77, 425, 6240, 77881, 2072, 47609, 50412, 410, 2381, 77, 425, 6240, 1584, 514, 13728, 59371, 410, 2381, 77, 425, 6240, 47, 4346, 451, 20564, 1096, 78462, 410, 2381, 77, 425, 6240, 2486, 3145, 1873, 15071, 410, 2381, 77, 425, 6240, 84800, 58524, 410, 2381, 77, 425, 6240, 51, 2726, 22937, 22294, 410, 2381, 77, 425, 6240, 7766, 31415, 91256, 905, 410, 59350, 11881, 8716, 2337, 461, 1428, 787, 461, 3252, 2337, 461, 5299, 1991, 3376, 1757, 357, 3496, 395, 30, 17352, 60]\n", + "Estimate input token count: 548\n", + "System prompt token count: 29\n", + "================================================\n", + "Message 2\n", + "Tokens: [58, 40200, 8716, 2337, 461, 17360, 787, 461, 3252, 2337, 461, 3575, 553, 261, 5937, 11, 11888, 11, 326, 10851, 49951, 6410, 29186, 326, 18600, 11793, 13, 4886, 8583, 382, 316, 1652, 5385, 3496, 27647, 395, 18211, 11, 26585, 11, 1101, 11, 5012, 11, 52778, 11, 3502, 82842, 11, 503, 1273, 14189, 13, 30141, 62340, 634, 22499, 4122, 402, 1043, 4857, 6410, 5207, 11, 9946, 11, 8831, 5517, 11, 3566, 2349, 11, 326, 26473, 15043, 77, 3392, 877, 16309, 155920, 827, 64804, 3392, 16, 13, 30141, 61400, 290, 1825, 155789, 11, 125460, 1043, 16969, 6410, 5207, 15043, 77, 17, 13, 23600, 395, 12486, 8731, 2164, 2254, 1721, 5066, 261, 3496, 25, 9946, 11, 6410, 81410, 350, 8096, 326, 6301, 936, 20713, 13599, 11, 4931, 328, 12839, 11, 6410, 15424, 11, 326, 1062, 61220, 503, 30152, 57179, 15043, 77, 18, 13, 2214, 1753, 35005, 11, 39712, 1096, 6240, 50576, 11, 97666, 11, 326, 45632, 410, 13, 3756, 625, 140412, 7749, 503, 30152, 2164, 26, 7665, 11, 9165, 290, 1825, 316, 107087, 11, 7313, 11525, 538, 481, 6284, 7620, 3543, 15043, 77, 19, 13, 36624, 722, 22488, 306, 261, 6240, 14994, 11, 47557, 6011, 410, 483, 118908, 11, 1543, 3636, 963, 11, 326, 31926, 5571, 13, 46613, 1701, 537, 85408, 77584, 15043, 77, 20, 13, 7649, 4561, 75841, 395, 7749, 9140, 11, 30152, 9607, 11, 326, 21380, 350, 3942, 316, 7313, 6059, 503, 125157, 12162, 182166, 77, 21, 13, 30141, 12332, 306, 44926, 165699, 57179, 11, 751, 26585, 11, 54083, 11, 503, 25689, 28089, 540, 290, 13330, 15043, 77, 22, 13, 134450, 290, 1825, 3572, 413, 261, 1577, 10158, 28939, 316, 290, 13330, 11, 813, 3931, 3814, 326, 17377, 9858, 15043, 77, 3392, 877, 25267, 18315, 26193, 395, 12625, 10867, 3392, 31639, 31653, 3392, 38169, 289, 591, 25, 354, 17500, 11, 4931, 92, 2733, 354, 122649, 3521, 306, 121985, 52933, 11, 45694, 21170, 77, 38169, 289, 316, 25, 354, 17500, 11, 4931, 92, 2733, 354, 183251, 3521, 306, 121985, 52933, 11, 45694, 21170, 77, 58, 35313, 659, 13599, 328, 5092, 60, 350, 63242, 395, 2454, 5666, 306, 12151, 2469, 15822, 27647, 23428, 77, 38169, 5207, 25, 354, 42743, 21170, 77, 55743, 25, 354, 32501, 10038, 29124, 10703, 21170, 77, 38169, 289, 483, 25, 354, 9186, 328, 3566, 11, 2086, 328, 1665, 21170, 77, 3392, 31639, 32055, 42943, 3392, 122003, 42943, 16008, 77, 12, 723, 92384, 5571, 483, 23292, 111146, 41488, 77, 12, 11555, 23292, 1757, 3931, 261, 4022, 109366, 350, 60291, 6118, 23428, 77, 11977, 316, 28921, 395, 41655, 16008, 77, 12, 723, 62873, 3438, 9362, 41488, 77, 5299, 7790, 16935, 316, 7972, 35455, 16008, 77, 12, 723, 92384, 5571, 483, 22499, 41488, 77, 13863, 32055, 42943, 16008, 77, 12, 723, 92384, 5571, 26, 3931, 40985, 11, 3230, 9140, 11, 8112, 41620, 41488, 77, 3392, 31639, 29386, 42816, 22483, 2733, 185530, 3392, 58, 4202, 483, 15697, 25, 151485, 11, 18328, 11, 38479, 11, 187600, 11, 32157, 2733, 2344, 220, 702, 20099, 656, 1636, 10636, 328, 3097, 326, 1058, 41488, 77, 3392, 31639, 29386, 42816, 22483, 2733, 6318, 3392, 58, 4202, 483, 2684, 15697, 2733, 2344, 220, 702, 41488, 77, 3392, 31639, 1225, 126808, 395, 723, 35313, 41488, 77, 7, 49704, 495, 7102, 395, 2454, 13330, 306, 261, 12151, 2469, 15822, 8831, 23428, 77, 16, 13, 11920, 395, 24861, 1058, 11, 2867, 326, 17776, 11, 326, 2698, 7704, 18744, 15043, 77, 17, 13, 43810, 2140, 35340, 503, 6124, 679, 4951, 42041, 1058, 15043, 77, 18, 13, 4063, 44926, 503, 12945, 31999, 49015, 15043, 77, 19, 13, 2214, 2454, 8831, 591, 2438, 355, 316, 418, 11, 1562, 3407, 52235, 7704, 3880, 11, 1636, 1577, 11, 483, 8508, 14, 9673, 15043, 77, 20, 13, 16349, 12781, 11, 3931, 5746, 11, 56644, 28952, 13189, 15043, 77, 21, 13, 132059, 6451, 21316, 350, 28393, 11, 51297, 11, 109671, 182166, 77, 3392, 877, 33202, 30207, 153256, 3392, 12, 6240, 55743, 41301, 142760, 81118, 22499, 316, 290, 1825, 19780, 82, 16969, 9946, 2733, 8397, 43639, 65677, 14818, 3880, 12604, 1825, 45615, 13782, 21510, 15043, 77, 12, 6240, 74598, 827, 7203, 142760, 1843, 261, 7967, 853, 6410, 14627, 3279, 11, 15940, 1373, 483, 261, 2823, 3461, 316, 290, 64831, 4256, 15043, 77, 12, 6240, 34, 17044, 9858, 142760, 51441, 143420, 11, 6439, 42280, 11, 326, 621, 19780, 82, 6662, 263, 19780, 1561, 395, 2454, 13330, 15043, 77, 12, 6240, 84781, 142760, 16349, 4149, 11, 7477, 538, 39004, 11, 18536, 11, 503, 7704, 553, 18240, 395, 1665, 483, 46746, 15043, 77, 12, 6240, 27363, 827, 18191, 142760, 62122, 2804, 12, 1806, 2698, 29284, 326, 7703, 15700, 15040, 15043, 77, 12, 6240, 154145, 21561, 142760, 2655, 16721, 12, 43793, 44562, 4732, 4122, 402, 6410, 15424, 326, 11122, 1238, 15043, 77, 12, 6240, 89367, 142760, 50210, 5377, 402, 34673, 10541, 11, 319, 81472, 82, 11, 326, 14619, 22758, 18744, 15043, 77, 3392, 877, 24855, 79895, 40924, 346, 75155, 929, 3392, 31639, 24855, 220, 16, 2733, 15362, 79531, 19291, 3392, 1844, 25, 392, 40, 4572, 2966, 316, 122657, 395, 220, 19, 3376, 3354, 60225, 128113, 5217, 117264, 77, 91655, 16008, 77, 58, 94272, 3149, 47557, 3496, 11, 3463, 7749, 9140, 538, 12781, 11, 21046, 76389, 483, 60225, 128113, 26379, 25522, 11, 7704, 11, 6372, 6723, 11, 326, 44926, 12870, 41488, 77, 3392, 31639, 24855, 220, 17, 2733, 8688, 21698, 3392, 1844, 25, 392, 40, 4572, 29908, 261, 220, 20, 14540, 6705, 15465, 306, 21230, 591, 8405, 117264, 77, 91655, 16008, 77, 58, 136093, 3496, 483, 30152, 5377, 11, 19486, 18536, 316, 15465, 26613, 11, 15186, 143420, 11, 34673, 4766, 3880, 11, 14456, 8173, 41488, 77, 3392, 31639, 24855, 220, 18, 2733, 14098, 80017, 3392, 1844, 25, 392, 19687, 8831, 316, 2036, 24044, 395, 220, 17, 7449, 591, 290, 8370, 117264, 77, 91655, 16008, 77, 58, 136093, 3496, 483, 12151, 2469, 15822, 76389, 11, 12987, 9656, 11, 2320, 22301, 35340, 11, 9946, 110693, 25738, 41488, 77, 3392, 10356, 59, 77, 48258, 62289, 316, 290, 8866, 326, 13636, 31756, 5151, 13, 3756, 625, 16677, 21436, 12604, 290, 1825, 45615, 28362, 82, 10275, 13, 1843, 62827, 11, 621, 625, 3931, 1238, 11, 503, 3810, 106819, 278, 1808, 11, 503, 2438, 1825, 402, 1919, 316, 717, 12331, 5377, 13, 3756, 625, 3644, 2164, 481, 553, 6675, 625, 3239, 1078, 13, 1843, 8437, 553, 625, 2839, 1299, 1880, 2624, 11, 5178, 13, 2733, 1623, 290, 1825, 1078, 290, 2684, 326, 3644, 1373, 31495, 402, 1495, 1023, 2023, 1646, 290, 2164, 1373, 4500, 3350, 350, 1821, 1053, 1653, 17492, 23206, 2105, 741, 2214, 1645, 136681, 11, 60114, 2733, 59, 16074, 15, 20997, 290, 14716, 2539, 52647, 13, 16935, 55959, 1825, 19780, 82, 4928, 2733, 3810, 722, 290, 8155, 5359, 14, 1447, 395, 290, 2164, 481, 19780, 67, 1309, 316, 413, 3741, 316, 6052, 1043, 5359, 461, 4180, 11881, 8716, 2337, 461, 1428, 787, 461, 3252, 2337, 461, 4827, 382, 290, 9029, 328, 10128, 48511, 4180, 11881, 8716, 2337, 461, 173781, 787, 461, 3252, 2337, 461, 976, 9029, 328, 10128, 382, 12650, 8856, 4180, 11881, 8716, 2337, 461, 1428, 787, 461, 3252, 2337, 461, 10930, 668, 220, 18, 77584, 1078, 55530, 326, 261, 1562, 328, 9610, 316, 4030, 59350, 11881, 8716, 2337, 461, 173781, 787, 461, 3252, 2337, 188301, 72782, 410, 382, 290, 9029, 326, 10574, 5030, 328, 10128, 11, 5542, 43727, 395, 1617, 1957, 11, 12808, 11, 41185, 29775, 11, 326, 9674, 13, 139431, 402, 290, 13728, 74722, 11, 12650, 853, 1339, 261, 5035, 6170, 328, 17496, 11, 140888, 11, 41881, 11, 326, 40944, 3630, 290, 220, 1422, 404, 14015, 13, 13974, 10358, 5678, 382, 45264, 306, 1617, 24022, 178328, 81461, 9059, 1736, 81, 1288, 316, 6363, 17573, 3944, 3098, 35251, 1617, 16044, 15093, 316, 9591, 5466, 9674, 326, 23118, 15043, 77, 623, 5030, 382, 4783, 22653, 316, 472, 392, 976, 5686, 328, 12936, 1, 5192, 316, 1617, 8117, 5430, 3354, 290, 21108, 328, 159801, 100506, 326, 1617, 6047, 36227, 328, 12901, 21787, 13, 12650, 382, 2237, 316, 1236, 328, 290, 2375, 802, 1645, 18416, 62888, 326, 91876, 11, 3463, 290, 168662, 11, 1118, 20327, 290, 135869, 44225, 11, 326, 290, 155511, 37994, 11, 1118, 168430, 290, 138561, 13, 13974, 50672, 9674, 11, 44015, 33304, 11, 326, 69119, 38794, 6544, 1147, 316, 1617, 21446, 13, 2381, 77, 12650, 382, 28261, 1511, 220, 455, 46334, 503, 425, 1614, 1415, 55898, 24077, 2454, 483, 1617, 2316, 5855, 13, 7217, 290, 1581, 128787, 33606, 328, 11992, 30028, 264, 316, 290, 65179, 328, 290, 3145, 1873, 11, 1753, 17528, 5297, 261, 5746, 3240, 13, 14959, 481, 19780, 264, 95286, 4251, 290, 74722, 11, 11606, 306, 49646, 139344, 108274, 11, 503, 24602, 261, 11270, 31359, 306, 261, 78208, 30469, 11, 12650, 59228, 481, 316, 9800, 1917, 326, 156553, 290, 14505, 2846, 481, 13, 2381, 77, 26691, 2381, 77, 37633, 20953, 12, 30514, 61128, 306, 12650, 25, 2381, 77, 425, 6240, 36, 129338, 37994, 410, 2381, 77, 425, 6240, 43, 81331, 17982, 410, 2381, 77, 425, 6240, 71851, 190700, 73752, 410, 2381, 77, 425, 6240, 50, 48434, 40468, 403, 3486, 410, 2381, 77, 425, 6240, 46920, 30028, 264, 827, 31575, 22830, 10050, 38909, 410, 2381, 77, 425, 6240, 1205, 13580, 12, 5859, 37543, 5161, 827, 34470, 334, 25062, 23036, 273, 410, 2381, 77, 425, 6240, 16476, 675, 328, 138349, 410, 350, 5283, 7539, 12650, 8, 2381, 77, 425, 6240, 48816, 2894, 272, 19780, 2251, 64494, 410, 2381, 77, 425, 6240, 77881, 2072, 47609, 50412, 410, 2381, 77, 425, 6240, 1584, 514, 13728, 59371, 410, 2381, 77, 425, 6240, 47, 4346, 451, 20564, 1096, 78462, 410, 2381, 77, 425, 6240, 2486, 3145, 1873, 15071, 410, 2381, 77, 425, 6240, 84800, 58524, 410, 2381, 77, 425, 6240, 51, 2726, 22937, 22294, 410, 2381, 77, 425, 6240, 7766, 31415, 91256, 905, 410, 59350, 11881, 8716, 2337, 461, 1428, 787, 461, 3252, 2337, 461, 5299, 1991, 3376, 1757, 357, 3496, 395, 30, 17352, 60]\n", + "Estimate input token count: 1624\n", + "System prompt token count: 1034\n" + ] + } + ], + "source": [ + "import tiktoken\n", + "\n", + "enc = tiktoken.encoding_for_model(\"gpt-4o-mini\")\n", + "\n", + "#combine all the messages[x].content into a single string\n", + "\n", + "# string_messages = \"\"\n", + "\n", + "# for m in messages:\n", + "# string_messages += \"{\" + m['role'] + \": \" + \" \" + m['content'] + \"}, \"\n", + " \n", + "# print(string_messages)\n", + "\n", + "\n", + "tokens = enc.encode(str(messages))\n", + "tokens_sys_prompt = enc.encode(messages[0]['content'])\n", + "\n", + "print(\"Message 1\")\n", + "print(\"Tokens: \", tokens)\n", + "print(\"Estimate input token count: \", len(tokens))\n", + "print(\"System prompt token count: \", len(tokens_sys_prompt))\n", + "print(\"================================================\")\n", + "\n", + "# Message 2 \n", + "print(\"Message 2\")\n", + "tokens_2 = enc.encode(str(messages_2))\n", + "tokens_2_sys_prompt = enc.encode(messages_2[0]['content'])\n", + "\n", + "print(\"Tokens: \", tokens_2)\n", + "print(\"Estimate input token count: \", len(tokens_2))\n", + "print(\"System prompt token count: \", len(tokens_2_sys_prompt))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3a7d3006", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ChatCompletion(id='chatcmpl-C2TfPJ9J6lLuD9apdd3ZJrYVCEym7', choices=[Choice(finish_reason='length', index=0, logprobs=None, message=ChatCompletionMessage(content='It depends on what you want to see and do in Paris! \\n\\n- **3 to 4 days**: This is a great option for a first-time visit, allowing you to explore major attractions like the Eiffel Tower, Louvre, Notre-Dame,', refusal=None, role='assistant', annotations=[], audio=None, function_call=None, tool_calls=None))], created=1754706731, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier='default', system_fingerprint='fp_34a54ae93c', usage=CompletionUsage(completion_tokens=50, prompt_tokens=486, total_tokens=536, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))\n", + "CompletionUsage(completion_tokens=50, prompt_tokens=486, total_tokens=536, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0))\n", + "================\n", + "Total tokens:\n", + "536\n", + "Prompt tokens: (Input Tokens)\n", + "486\n", + "Cached Prompt Tokens:\n", + "0\n", + "Completion Tokens: (Output Tokens)\n", + "50\n", + "It depends on what you want to see and do in Paris! \n", + "\n", + "- **3 to 4 days**: This is a great option for a first-time visit, allowing you to explore major attractions like the Eiffel Tower, Louvre, Notre-Dame,\n" + ] + } + ], + "source": [ + "# CHat completion openai call to get a response for messages\n", + "\n", + "import os\n", + "from openai import OpenAI\n", + "from dotenv import load_dotenv\n", + "\n", + "load_dotenv()\n", + "\n", + "client = OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"))\n", + "\n", + "\n", + "#Chat Completion\n", + "response = client.chat.completions.create(\n", + " model=\"gpt-4o-mini\",\n", + " messages=messages,\n", + " max_tokens=50,\n", + ")\n", + "\n", + "\n", + "print(response)\n", + "print(response.usage)\n", + "print(\"================\")\n", + "print(\"Total tokens:\")\n", + "print(response.usage.total_tokens)\n", + "print(\"Prompt tokens: (Input Tokens)\")\n", + "print(response.usage.prompt_tokens)\n", + "print(\"Cached Prompt Tokens:\")\n", + "print(response.usage.prompt_tokens_details.cached_tokens)\n", + "print(\"Completion Tokens: (Output Tokens)\")\n", + "print(response.usage.completion_tokens)\n", + "print(response.choices[0].message.content)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cab27260", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "First Message\n", + "Input Cost: 7.29e-05\n", + "Output Cost: 2.9999999999999997e-05\n", + "Total Cost: 0.0001029\n" + ] + } + ], + "source": [ + "# Prices (per token)\n", + "\n", + "input_text_token_price = 0.00000015\n", + "input_text_cached_token_price = 0.000000075\n", + "output_text_token_price = 0.0000006\n", + "\n", + "\n", + "# Cost without Caching \n", + "input_text_token_cost = input_text_token_price * response.usage.prompt_tokens\n", + "output_text_token_cost = output_text_token_price * response.usage.completion_tokens\n", + "total_cost = input_text_token_cost + output_text_token_cost\n", + "\n", + "\n", + "print(\"First Message\")\n", + "print(\"Input Cost: \", input_text_token_cost)\n", + "print(\"Output Cost: \", output_text_token_cost)\n", + "print(\"Total Cost: \", total_cost)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "bf0d38bf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ChatCompletion(id='chatcmpl-C2TfQ8Y03tMwChqhpOCFDiRCmZxCi', choices=[Choice(finish_reason='length', index=0, logprobs=None, message=ChatCompletionMessage(content='The number of days you should plan for a trip to Paris can vary based on your interests and itinerary. Here are some general recommendations:\\n\\n### Short Trip (3-4 days)\\n- **Ideal for:** First-time visitors who want to see the major highlights.\\n- **Focus on:** Must-see attractions like the Eiffel Tower, Louvre Museum, Notre-Dame Cathedral, and a stroll along the Seine. You can also fit in a day trip to Versailles.\\n\\n### Moderate Trip (5-7 days)\\n-', refusal=None, role='assistant', annotations=[], audio=None, function_call=None, tool_calls=None))], created=1754706732, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier='default', system_fingerprint='fp_34a54ae93c', usage=CompletionUsage(completion_tokens=100, prompt_tokens=1491, total_tokens=1591, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))\n", + "CompletionUsage(completion_tokens=100, prompt_tokens=1491, total_tokens=1591, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0))\n", + "================\n", + "Total tokens:\n", + "1591\n", + "Prompt tokens: (Input Tokens)\n", + "1491\n", + "Cached Prompt Tokens:\n", + "0\n", + "Completion Tokens: (Output Tokens)\n", + "100\n", + "================\n", + "The number of days you should plan for a trip to Paris can vary based on your interests and itinerary. Here are some general recommendations:\n", + "\n", + "### Short Trip (3-4 days)\n", + "- **Ideal for:** First-time visitors who want to see the major highlights.\n", + "- **Focus on:** Must-see attractions like the Eiffel Tower, Louvre Museum, Notre-Dame Cathedral, and a stroll along the Seine. You can also fit in a day trip to Versailles.\n", + "\n", + "### Moderate Trip (5-7 days)\n", + "-\n" + ] + } + ], + "source": [ + "# Caching kicks-in at 1024 tokens\n", + "\n", + "#Chat Completion\n", + "response_2 = client.chat.completions.create(\n", + " model=\"gpt-4o-mini\",\n", + " messages=messages_2,\n", + " max_tokens=100,\n", + ")\n", + "\n", + "\n", + "\n", + "print(response_2)\n", + "print(response_2.usage)\n", + "print(\"================\")\n", + "print(\"Total tokens:\")\n", + "print(response_2.usage.total_tokens)\n", + "print(\"Prompt tokens: (Input Tokens)\")\n", + "print(response_2.usage.prompt_tokens)\n", + "print(\"Cached Prompt Tokens:\")\n", + "print(response_2.usage.prompt_tokens_details.cached_tokens)\n", + "print(\"Completion Tokens: (Output Tokens)\")\n", + "print(response_2.usage.completion_tokens)\n", + "print(\"================\")\n", + "print(response_2.choices[0].message.content)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b3fa39be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Uncached input text tokens: 1491\n", + "Caching\n", + "Input text uncached token cost: 0.00022365\n", + "Input text cached token cost: 0.0\n", + "Total input text token cost: 0.00022365\n", + "Output text token cost: 5.9999999999999995e-05\n", + "Total cost: 0.00028365\n" + ] + } + ], + "source": [ + "# Cost without Caching \n", + "\n", + "uncached_input_text_tokens = response_2.usage.prompt_tokens - response_2.usage.prompt_tokens_details.cached_tokens\n", + "print(\"Uncached input text tokens: \", uncached_input_text_tokens)\n", + "\n", + "ucached_input_text_token_cost = uncached_input_text_tokens * input_text_token_price\n", + "cached_input_text_token_cost = response_2.usage.prompt_tokens_details.cached_tokens * input_text_cached_token_price\n", + "input_text_token_cost = ucached_input_text_token_cost + cached_input_text_token_cost\n", + "output_text_token_cost = output_text_token_price * response_2.usage.completion_tokens\n", + "\n", + "print(\"Caching\")\n", + "print(\"Input text uncached token cost: \", ucached_input_text_token_cost)\n", + "print(\"Input text cached token cost: \", cached_input_text_token_cost)\n", + "print(\"Total input text token cost: \", input_text_token_cost)\n", + "print(\"Output text token cost: \", output_text_token_cost)\n", + "print(\"Total cost: \", input_text_token_cost + output_text_token_cost)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "91469155", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ChatCompletion(id='chatcmpl-C2TfSwSUp8xoVmK1pXqmZiY94M90K', choices=[Choice(finish_reason='length', index=0, logprobs=None, message=ChatCompletionMessage(content='The ideal duration for a trip to Paris can vary depending on your interests, travel style, and the experiences you wish to have. However, I recommend the following:\\n\\n### Recommended Duration: \\n- **3 Days**: Perfect for first-time visitors who want to cover the main attractions like the Eiffel Tower, Louvre, and Notre-Dame Cathedral. This duration allows for a decent overview of the city but may feel rushed.\\n- **5 Days**: This timeframe lets you explore major sites in-depth, such', refusal=None, role='assistant', annotations=[], audio=None, function_call=None, tool_calls=None))], created=1754706734, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier='default', system_fingerprint='fp_34a54ae93c', usage=CompletionUsage(completion_tokens=100, prompt_tokens=1491, total_tokens=1591, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=1408)))\n", + "CompletionUsage(completion_tokens=100, prompt_tokens=1491, total_tokens=1591, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=1408))\n", + "================\n", + "Total tokens:\n", + "1591\n", + "Prompt tokens: (Input Tokens)\n", + "1491\n", + "Cached Prompt Tokens:\n", + "1408\n", + "Completion Tokens: (Output Tokens)\n", + "100\n", + "The ideal duration for a trip to Paris can vary depending on your interests, travel style, and the experiences you wish to have. However, I recommend the following:\n", + "\n", + "### Recommended Duration: \n", + "- **3 Days**: Perfect for first-time visitors who want to cover the main attractions like the Eiffel Tower, Louvre, and Notre-Dame Cathedral. This duration allows for a decent overview of the city but may feel rushed.\n", + "- **5 Days**: This timeframe lets you explore major sites in-depth, such\n" + ] + } + ], + "source": [ + "# This should have cached tokens\n", + "#Chat Completion\n", + "response_2 = client.chat.completions.create(\n", + " model=\"gpt-4o-mini\",\n", + " messages=messages_2,\n", + " max_tokens=100,\n", + ")\n", + "\n", + "\n", + "\n", + "print(response_2)\n", + "print(response_2.usage)\n", + "print(\"================\")\n", + "print(\"Total tokens:\")\n", + "print(response_2.usage.total_tokens)\n", + "print(\"Prompt tokens: (Input Tokens)\")\n", + "print(response_2.usage.prompt_tokens)\n", + "print(\"Cached Prompt Tokens:\")\n", + "print(response_2.usage.prompt_tokens_details.cached_tokens)\n", + "print(\"Completion Tokens: (Output Tokens)\")\n", + "print(response_2.usage.completion_tokens)\n", + "print(response_2.choices[0].message.content)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9979d74f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "budget = 550; \n", + "\n", + "output_token_budget = budget - len(tokens)\n", + "\n", + "print(output_token_budget)\n", + "\n", + "# Simillar deal for context-window management" + ] + }, + { + "cell_type": "markdown", + "id": "09ff5be7", + "metadata": {}, + "source": [ + "## Anthropic" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a53522c8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "556\n" + ] + } + ], + "source": [ + "import anthropic\n", + "import json\n", + "\n", + "# Create messages list with role=system\n", + "\n", + "client = anthropic.Anthropic()\n", + "\n", + "anthropic_response = client.messages.count_tokens(\n", + " model=\"claude-opus-4-1-20250805\",\n", + " system=\"You are a helpful assistant. Answer in crisp & friendly language\",\n", + " messages=messages[1:],\n", + ")\n", + "\n", + "processed_response = json.loads(anthropic_response.model_dump_json())\n", + "\n", + "print(processed_response['input_tokens'])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "050c0180", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Budget: 55.6\n", + "================================================\n", + "Response: For Paris, I'd recommend **4-7 days** depending on your travel style:\n", + "\n", + "**4-5 days** is perfect for first-time visitors who want to see the major highlights without feeling rushed. This gives you time for the Eiffel\n", + "================================================\n", + "Usage: Usage(cache_creation_input_tokens=0, cache_read_input_tokens=0, input_tokens=556, output_tokens=55, server_tool_use=None, service_tier='standard')\n", + "Input tokens: 556\n", + "Output tokens: 55\n", + "Total tokens: 611\n", + "================================================\n", + "Cached tokens (write): 0\n", + "Cached tokens (read): 0\n", + "================================================\n" + ] + } + ], + "source": [ + "budget = processed_response['input_tokens'] * 10/100\n", + "\n", + "print(\"Budget: \", budget)\n", + "print(\"================================================\")\n", + "\n", + "\n", + "anthropic_response = client.messages.create(\n", + " model=\"claude-sonnet-4-20250514\",\n", + " system=\"You are a helpful assistant. Answer in crisp & friendly language\",\n", + " messages=messages[1:],\n", + " max_tokens=int(budget),\n", + ")\n", + "\n", + "\n", + "print(\"Response: \", anthropic_response.content[0].text)\n", + "print(\"================================================\")\n", + "print(\"Usage: \", anthropic_response.usage)\n", + "print(\"Input tokens: \", anthropic_response.usage.input_tokens)\n", + "print(\"Output tokens: \", anthropic_response.usage.output_tokens)\n", + "print(\"Total tokens: \", anthropic_response.usage.input_tokens + anthropic_response.usage.output_tokens)\n", + "print(\"================================================\")\n", + "print(\"Cached tokens (write): \", anthropic_response.usage.cache_creation_input_tokens)\n", + "print(\"Cached tokens (read): \", anthropic_response.usage.cache_read_input_tokens)\n", + "print(\"================================================\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8c3b552f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Input text token cost: 0.001458\n", + "Output text token cost: 0.00075\n", + "Total cost: 0.002208\n" + ] + } + ], + "source": [ + "# Cost Calculations\n", + "\n", + "\n", + "input_text_token_price = 0.000003\n", + "output_text_token_price = 0.000015\n", + "\n", + "\n", + "# Caching \n", + "\n", + "text_cache_write_token_price = 0.00000375\n", + "text_cache_read_token_price = 0.0000003\n", + "\n", + "\n", + "# Cost Calculations\n", + "input_text_token_cost = input_text_token_price * response.usage.prompt_tokens\n", + "output_text_token_cost = output_text_token_price * response.usage.completion_tokens\n", + "\n", + "print(\"Input text token cost: \", input_text_token_cost)\n", + "print(\"Output text token cost: \", output_text_token_cost)\n", + "print(\"Total cost: \", input_text_token_cost + output_text_token_cost)\n" + ] + }, + { + "cell_type": "markdown", + "id": "776b74e4", + "metadata": {}, + "source": [ + "## Gemini" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "0c7cda9c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "total_tokens: sdk_http_response=HttpResponse(\n", + " headers=\n", + ") total_tokens=11 cached_content_token_count=None\n", + "================================================\n", + "Total Tokens: 11\n" + ] + } + ], + "source": [ + "from google import genai\n", + "import os\n", + "from dotenv import load_dotenv\n", + "\n", + "load_dotenv()\n", + "\n", + "\n", + "client = genai.Client(api_key=os.getenv(\"GEMINI_API_KEY\"))\n", + "prompt = \"The quick brown fox jumps over the lazy dog.\"\n", + "\n", + "# Count tokens using the new client method.\n", + "total_tokens = client.models.count_tokens(\n", + " model=\"gemini-2.0-flash\", contents=prompt\n", + ")\n", + "print(\"total_tokens: \", total_tokens)\n", + "print(\"================================================\")\n", + "print(\"Total Tokens: \",json.loads(total_tokens.model_dump_json())['total_tokens'])" + ] + }, + { + "cell_type": "markdown", + "id": "766d1c5c", + "metadata": {}, + "source": [ + "# OpenRouter" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "4be1f219", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✅ API Key loaded successfully.\n", + "CompletionUsage(completion_tokens=100, prompt_tokens=486, total_tokens=586, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=None, audio_tokens=None, reasoning_tokens=0, rejected_prediction_tokens=None), prompt_tokens_details=PromptTokensDetails(audio_tokens=None, cached_tokens=0))\n", + "It depends on what you want to see and do in Paris! However, a typical recommendation is:\n", + "\n", + "- **3 Days**: A quick getaway covering major highlights like the Eiffel Tower, Louvre, Montmartre, and a Seine River cruise.\n", + "- **5 Days**: More time to explore additional attractions like Notre-Dame, Musée d'Orsay, and neighborhoods.\n", + "- **7 Days**: Ideal for a relaxed pace, allowing time for day trips to places like Versailles or Disneyland Paris, as well\n", + "================================================\n", + "Total Tokens: 586\n", + "Prompt Tokens: 486\n", + "Completion Tokens: 100\n", + "================================================\n", + "Prompt Tokens Details: PromptTokensDetails(audio_tokens=None, cached_tokens=0)\n", + "Completion Tokens Details: CompletionTokensDetails(accepted_prediction_tokens=None, audio_tokens=None, reasoning_tokens=0, rejected_prediction_tokens=None)\n", + "================================================\n", + "Cached Tokens: 0\n" + ] + } + ], + "source": [ + "api_key = os.getenv(\"OPENROUTER_API_KEY\")\n", + "\n", + "if not api_key:\n", + " raise ValueError(\"🔴 OPENROUTER_API_KEY not found. Make sure it's in your .env file.\")\n", + "\n", + "print(f\"✅ API Key loaded successfully.\")\n", + "\n", + "client = OpenAI(\n", + " base_url=\"https://openrouter.ai/api/v1\",\n", + " api_key=api_key\n", + ")\n", + "\n", + "\n", + "# Chat Completion\n", + "completion = client.chat.completions.create(\n", + " model=\"openai/gpt-4o-mini\",\n", + " messages=messages,\n", + " max_tokens=100,\n", + ")\n", + "\n", + "print(completion.usage)\n", + "print(completion.choices[0].message.content)\n", + "print(\"================================================\")\n", + "print(\"Total Tokens: \", completion.usage.total_tokens)\n", + "print(\"Prompt Tokens: \", completion.usage.prompt_tokens)\n", + "print(\"Completion Tokens: \", completion.usage.completion_tokens)\n", + "print(\"================================================\")\n", + "print(\"Prompt Tokens Details: \", completion.usage.prompt_tokens_details)\n", + "print(\"Completion Tokens Details: \", completion.usage.completion_tokens_details)\n", + "print(\"================================================\")\n", + "print(\"Cached Tokens: \", completion.usage.prompt_tokens_details.cached_tokens)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}