Save workspace changes

This commit is contained in:
2026-04-18 17:02:56 +02:00
parent f02ea9a711
commit 87d60af5a9
4220 changed files with 1388603 additions and 1554 deletions

113
config/ai_biography.php Normal file
View File

@@ -0,0 +1,113 @@
<?php
declare(strict_types=1);
return [
/*
|--------------------------------------------------------------------------
| AI Biography enabled flag
|--------------------------------------------------------------------------
| Set to false to skip generation globally (e.g. while deploying).
*/
'enabled' => env('AI_BIOGRAPHY_ENABLED', true),
/*
|--------------------------------------------------------------------------
| LLM provider
|--------------------------------------------------------------------------
| Supported providers:
| - together (Together.ai primary, google/gemma-3n-E4B-it)
| - vision_gateway (Skinbase Vision gateway, uses VISION_GATEWAY_URL / API key)
| - gemini (direct Google Gemini API)
| - home (remote LM Studio / OpenAI-compatible endpoint)
*/
'provider' => env('AI_BIOGRAPHY_LLM_PROVIDER', 'together'),
/*
|--------------------------------------------------------------------------
| Together.ai provider (primary)
|--------------------------------------------------------------------------
| Used when AI_BIOGRAPHY_LLM_PROVIDER=together (the default).
|
| Example:
| TOGETHER_API_KEY=your_key_here
| AI_BIOGRAPHY_TOGETHER_MODEL=google/gemma-3n-E4B-it
*/
'together' => [
'base_url' => env('AI_BIOGRAPHY_TOGETHER_BASE_URL', 'https://api.together.xyz'),
'endpoint' => env('AI_BIOGRAPHY_TOGETHER_ENDPOINT', '/v1/chat/completions'),
'model' => env('AI_BIOGRAPHY_TOGETHER_MODEL', 'google/gemma-3n-E4B-it'),
'api_key' => env('TOGETHER_API_KEY', env('AI_BIOGRAPHY_TOGETHER_API_KEY', '')),
'timeout_seconds' => (int) env('AI_BIOGRAPHY_TOGETHER_TIMEOUT', env('AI_BIOGRAPHY_LLM_TIMEOUT', 90)),
'connect_timeout_seconds' => (int) env('AI_BIOGRAPHY_TOGETHER_CONNECT_TIMEOUT', 5),
],
/*
|--------------------------------------------------------------------------
| Vision LLM gateway endpoint
|--------------------------------------------------------------------------
| Primary endpoint: /ai/chat (preferred for the Skinbase Vision gateway)
| Fallback: /v1/chat/completions (OpenAI-compatible)
|
| Base URL and API key are shared with the existing Vision gateway config:
| VISION_GATEWAY_URL / VISION_GATEWAY_API_KEY
*/
'llm_endpoint' => env('AI_BIOGRAPHY_LLM_ENDPOINT', '/ai/chat'),
'llm_fallback_endpoint' => env('AI_BIOGRAPHY_LLM_FALLBACK_ENDPOINT', '/v1/chat/completions'),
'llm_timeout_seconds' => (int) env('AI_BIOGRAPHY_LLM_TIMEOUT', 90),
'llm_model' => env('AI_BIOGRAPHY_LLM_MODEL', 'vision-gateway'),
/*
|--------------------------------------------------------------------------
| Gemini direct API (optional alternative provider)
|--------------------------------------------------------------------------
| Used when AI_BIOGRAPHY_LLM_PROVIDER=gemini.
|
| Example:
| GEMINI_API_KEY=...
| AI_BIOGRAPHY_GEMINI_MODEL=gemini-flash-latest
*/
'gemini' => [
'base_url' => env('AI_BIOGRAPHY_GEMINI_BASE_URL', 'https://generativelanguage.googleapis.com'),
'model' => env('AI_BIOGRAPHY_GEMINI_MODEL', 'gemini-flash-latest'),
'api_key' => env('GEMINI_API_KEY', env('AI_BIOGRAPHY_GEMINI_API_KEY', '')),
],
/*
|--------------------------------------------------------------------------
| Home LM Studio API (optional alternative provider)
|--------------------------------------------------------------------------
| Used when AI_BIOGRAPHY_LLM_PROVIDER=home.
| This targets a remote LM Studio / OpenAI-compatible endpoint.
|
| Example:
| AI_BIOGRAPHY_HOME_BASE_URL=http://home.klevze.si:8200
| AI_BIOGRAPHY_HOME_MODEL=qwen/qwen3.5-9b
*/
'home' => [
'base_url' => env('AI_BIOGRAPHY_HOME_BASE_URL', 'http://home.klevze.si:8200'),
'endpoint' => env('AI_BIOGRAPHY_HOME_ENDPOINT', '/v1/chat/completions'),
'model' => env('AI_BIOGRAPHY_HOME_MODEL', 'qwen/qwen3.5-9b'),
'api_key' => env('AI_BIOGRAPHY_HOME_API_KEY', ''),
'verify_ssl' => env('AI_BIOGRAPHY_HOME_VERIFY_SSL', true),
'timeout_seconds' => (int) env('AI_BIOGRAPHY_HOME_TIMEOUT', env('AI_BIOGRAPHY_LLM_TIMEOUT', 90)),
'connect_timeout_seconds' => (int) env('AI_BIOGRAPHY_HOME_CONNECT_TIMEOUT', 3),
],
/*
|--------------------------------------------------------------------------
| Queue
|--------------------------------------------------------------------------
| Queue name for GenerateAiBiographyJob.
*/
'queue' => env('AI_BIOGRAPHY_QUEUE', 'default'),
/*
|--------------------------------------------------------------------------
| Stale threshold (days)
|--------------------------------------------------------------------------
| A biography is considered stale if older than this many days
| AND the source hash has changed. The batch refresh command uses this.
*/
'stale_threshold_days' => (int) env('AI_BIOGRAPHY_STALE_DAYS', 30),
];

View File

@@ -4,6 +4,7 @@ declare(strict_types=1);
return [
'viewer' => [
'guest_mode' => env('MATURITY_GUEST_MODE', 'hide'),
'default_mode' => env('MATURITY_DEFAULT_MODE', 'blur'),
'default_warn_on_detail' => env('MATURITY_DEFAULT_WARN_ON_DETAIL', true),
],

View File

@@ -96,11 +96,16 @@ return [
'tags',
'category',
'content_type',
'published_as_type',
'orientation',
'resolution',
'author_id',
'is_public',
'is_approved',
'is_mature',
'is_mature_effective',
'maturity_level',
'maturity_status',
'has_missing_thumbnails',
'created_at',
],

View File

@@ -73,6 +73,19 @@ return [
'collections_endpoint' => env('VISION_VECTOR_GATEWAY_COLLECTIONS_ENDPOINT', '/vectors/collections'),
],
'tag_suggestions' => [
'provider' => env('VISION_TAG_SUGGESTIONS_PROVIDER', 'lm_studio'),
],
'together' => [
'base_url' => env('VISION_TOGETHER_BASE_URL', 'https://api.together.xyz'),
'endpoint' => env('VISION_TOGETHER_ENDPOINT', '/v1/chat/completions'),
'model' => env('VISION_TOGETHER_MODEL', 'meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo'),
'api_key' => env('VISION_TOGETHER_API_KEY', env('TOGETHER_API_KEY', '')),
'timeout' => (int) env('VISION_TOGETHER_TIMEOUT', 90),
'connect_timeout' => (int) env('VISION_TOGETHER_CONNECT_TIMEOUT', 5),
],
/*
|--------------------------------------------------------------------------
| LM Studio local multimodal inference (tag generation)

140
config/worlds.php Normal file
View File

@@ -0,0 +1,140 @@
<?php
declare(strict_types=1);
return [
'default_section_order' => [
'featured_artworks',
'featured_collections',
'featured_creators',
'featured_groups',
'news',
'challenge',
'events',
'releases',
'cards',
],
'sections' => [
'featured_artworks' => [
'label' => 'Featured artworks',
'description' => 'Standout pieces curated for this world.',
'relation_types' => ['artwork'],
],
'featured_collections' => [
'label' => 'Curated collections',
'description' => 'Collections that deepen the theme and reward longer exploration.',
'relation_types' => ['collection'],
],
'featured_creators' => [
'label' => 'Featured creators',
'description' => 'Creators shaping the atmosphere of this world.',
'relation_types' => ['user'],
],
'featured_groups' => [
'label' => 'Featured groups',
'description' => 'Collectives, scenes, and crews connected to the moment.',
'relation_types' => ['group'],
],
'news' => [
'label' => 'Related news',
'description' => 'Editorial context, announcements, and stories tied to the world.',
'relation_types' => ['news'],
],
'challenge' => [
'label' => 'Challenge spotlight',
'description' => 'Active or recent challenge participation for this world.',
'relation_types' => ['challenge'],
],
'events' => [
'label' => 'Related events',
'description' => 'Upcoming sessions, launches, and live moments around the theme.',
'relation_types' => ['event'],
],
'releases' => [
'label' => 'Release spotlights',
'description' => 'Projects and releases that belong in this campaign space.',
'relation_types' => ['release'],
],
'cards' => [
'label' => 'Themed cards',
'description' => 'Collectible Nova cards that extend the world identity.',
'relation_types' => ['card'],
],
],
'relation_types' => [
'artwork' => 'Artwork',
'collection' => 'Collection',
'user' => 'Creator',
'group' => 'Group',
'news' => 'News article',
'challenge' => 'Challenge',
'event' => 'Event',
'release' => 'Release',
'card' => 'Card',
],
'themes' => [
'halloween' => [
'label' => 'Halloween',
'accent_color' => '#f97316',
'accent_color_secondary' => '#7c2d12',
'background_motif' => 'embers',
'icon_name' => 'fa-solid fa-ghost',
'related_tags_json' => ['halloween', 'spooky', 'autumn'],
'suggested_badge_label' => 'Season highlight',
'suggested_cta_label' => 'Enter Halloween world',
],
'christmas' => [
'label' => 'Christmas',
'accent_color' => '#dc2626',
'accent_color_secondary' => '#14532d',
'background_motif' => 'frost',
'icon_name' => 'fa-solid fa-tree',
'related_tags_json' => ['christmas', 'winter', 'holiday'],
'suggested_badge_label' => 'Holiday spotlight',
'suggested_cta_label' => 'Explore Christmas highlights',
],
'summer' => [
'label' => 'Summer',
'accent_color' => '#f59e0b',
'accent_color_secondary' => '#0f766e',
'background_motif' => 'sunwash',
'icon_name' => 'fa-solid fa-sun',
'related_tags_json' => ['summer', 'sunwash', 'festival'],
'suggested_badge_label' => 'Seasonal spotlight',
'suggested_cta_label' => 'Explore summer picks',
],
'retro-month' => [
'label' => 'Retro Month',
'accent_color' => '#fb7185',
'accent_color_secondary' => '#312e81',
'background_motif' => 'scanlines',
'icon_name' => 'fa-solid fa-compact-disc',
'related_tags_json' => ['retro', 'demoscene', 'scanlines'],
'suggested_badge_label' => 'Editorial pick',
'suggested_cta_label' => 'Enter Retro Month',
],
'pixel-week' => [
'label' => 'Pixel Week',
'accent_color' => '#22c55e',
'accent_color_secondary' => '#166534',
'background_motif' => 'pixels',
'icon_name' => 'fa-solid fa-table-cells',
'related_tags_json' => ['pixel', 'pixel-art', 'week'],
'suggested_badge_label' => 'Pixel spotlight',
'suggested_cta_label' => 'Explore Pixel Week',
],
'demoscene-tribute-week' => [
'label' => 'Demoscene Tribute Week',
'accent_color' => '#38bdf8',
'accent_color_secondary' => '#1d4ed8',
'background_motif' => 'crt',
'icon_name' => 'fa-solid fa-wave-square',
'related_tags_json' => ['demoscene', 'tribute', 'crt'],
'suggested_badge_label' => 'Tribute spotlight',
'suggested_cta_label' => 'Enter tribute week',
],
],
];