AgentSkillsCN

developing-with-prism

Prism PHP 软件包开发指南——一款用于集成大语言模型的 Laravel 包。在使用 Prism 的各项功能时,请根据需要启用或调用相关功能,包括文本生成、结构化输出、嵌入式向量、图像生成、音频处理、流式传输、工具/函数调用,以及与各类大语言模型提供商的集成(如 OpenAI、Anthropic、Gemini、Mistral、Groq、XAI、DeepSeek、OpenRouter、Ollama、VoyageAI、ElevenLabs)。适用于所有与 Prism 相关的开发任务。

SKILL.md
--- frontmatter
name: developing-with-prism
description: Guide for developing with Prism PHP package - a Laravel package for integrating LLMs. Activate or use when working with Prism features including text generation, structured output, embeddings, image generation, audio processing, streaming, tools/function calling, or any LLM provider integration (OpenAI, Anthropic, Gemini, Mistral, Groq, XAI, DeepSeek, OpenRouter, Ollama, VoyageAI, ElevenLabs). Activate for any Prism-related development tasks.

Developing with Prism

Prism is a Laravel package for integrating Large Language Models (LLMs) into applications with a fluent, expressive and eloquent API.

Basic Usage Examples

Text Generation

php
use Prism\Prism\Facades\Prism;
use Prism\Prism\Enums\Provider;

$response = Prism::text()
    ->using(Provider::Anthropic, 'claude-3-5-sonnet-20241022')
    ->withSystemPrompt('You are an expert mathematician.')
    ->withPrompt('Explain the Pythagorean theorem.')
    ->asText();

echo $response->text;

Structured Output

php
use Prism\Prism\Facades\Prism;
use Prism\Prism\Enums\Provider;
use Prism\Prism\Schema\ObjectSchema;
use Prism\Prism\Schema\StringSchema;

$schema = new ObjectSchema(
    name: 'movie_review',
    description: 'A structured movie review',
    properties: [
        new StringSchema('title', 'The movie title'),
        new StringSchema('rating', 'Rating out of 5 stars'),
        new StringSchema('summary', 'Brief review summary')
    ],
    requiredFields: ['title', 'rating', 'summary']
);

$response = Prism::structured()
    ->using(Provider::OpenAI, 'gpt-4o')
    ->withSchema($schema)
    ->withPrompt('Review the movie Inception')
    ->asStructured();

$review = $response->structured;
echo $review['title'];

Streaming (Server-Sent Events)

php
Route::get('/chat', function () {
    return Prism::text()
        ->using('anthropic', 'claude-3-7-sonnet')
        ->withPrompt(request('message'))
        ->asEventStreamResponse();
});

Tools / Function Calling

php
use Prism\Prism\Facades\Prism;
use Prism\Prism\Tool;

$weatherTool = Tool::as('get_weather')
    ->for('Get current weather for a location')
    ->withStringParameter('location', 'The city and state')
    ->using(fn (string $location): string =>
        "Weather in {$location}: 72F, sunny"
    );

$response = Prism::text()
    ->using('anthropic', 'claude-3-5-sonnet-latest')
    ->withTools([$weatherTool])
    ->withMaxSteps(3)
    ->withPrompt('What is the weather in San Francisco?')
    ->asText();

Multi-Modal (Images/Documents)

php
use Prism\Prism\ValueObjects\Media\Image;
use Prism\Prism\ValueObjects\Media\Document;

$response = Prism::text()
    ->using(Provider::Anthropic, 'claude-3-5-sonnet-20241022')
    ->withPrompt(
        'What objects do you see in this image?',
        [Image::fromLocalPath('/path/to/image.jpg')]
    )
    ->asText();

Prism Documentation

IMPORTANT: Always search the docs before implementing Prism features.

How to Search

  1. Read a specific doc file directly:

    code
    read vendor/prism-php/prism/docs/core-concepts/text-generation.md
    read vendor/prism-php/prism/docs/providers/openai.md
    
  2. Search for a topic across docs:

    code
    grep "streaming" vendor/prism-php/prism/docs/
    grep "withProviderOptions" vendor/prism-php/prism/docs/providers/
    
  3. Find all doc files:

    code
    glob "vendor/prism-php/prism/docs/**/*.md"
    

Documentation Paths

NeedRead This File
Text generationdocs/core-concepts/text-generation.md
Streaming responsesdocs/core-concepts/streaming-output.md
Tools / function callingdocs/core-concepts/tools-function-calling.md
Structured JSON outputdocs/core-concepts/structured-output.md
Embeddingsdocs/core-concepts/embeddings.md
Image generationdocs/core-concepts/image-generation.md
Audio (TTS/STT)docs/core-concepts/audio.md
Schema definitionsdocs/core-concepts/schemas.md
Testingdocs/core-concepts/testing.md
Image inputdocs/input-modalities/images.md
Document input (PDF)docs/input-modalities/documents.md
OpenAI optionsdocs/providers/openai.md
Anthropic optionsdocs/providers/anthropic.md
Other providersdocs/providers/{provider}.md
Error handlingdocs/advanced/error-handling.md

Source Code Reference

For implementation details:

code
glob "src/**/*.php"
grep "class Tool" src/

Key Patterns

  • Use Prism\Prism\Facades\Prism facade or prism() helper
  • Core methods: Prism::text(), Prism::structured(), Prism::embeddings(), Prism::image(), Prism::audio()
  • Chain ->using(Provider::Name, 'model-id') to specify provider/model
  • Finalize with: ->asText(), ->asStructured(), ->asStream(), ->asEventStreamResponse(), ->asDataStreamResponse()

Provider-Specific Options

Use ->withProviderOptions([...]) to pass provider-specific features:

php
$response = Prism::text()
    ->using('anthropic', 'claude-3-7-sonnet-latest')
    ->withPrompt('Your prompt')
    ->withProviderOptions(['thinking' => ['enabled' => true]])  // Anthropic-specific
    ->asText();

Always search the provider docs first to find available options for each provider:

  • docs/providers/openai.md - strict mode, reasoning, image generation options
  • docs/providers/anthropic.md - thinking mode, prompt caching, citations
  • docs/providers/gemini.md, docs/providers/mistral.md, etc.

Common Pitfalls

Wrong Package Name

NEVER use the old package: echolabsdev/prism is deprecated.

ALWAYS use: prism-php/prism

bash

# Correct

composer require prism-php/prism

# Wrong - do not use

composer require echolabsdev/prism

Wrong Namespace

ALWAYS use the Prism\Prism namespace for all Prism classes:

php
// Correct
use Prism\Prism\Facades\Prism;
use Prism\Prism\Enums\Provider;
use Prism\Prism\Tool;
use Prism\Prism\Schema\ObjectSchema;

// Wrong - these namespaces do not exist
use EchoLabs\Prism\Prism;
use Prism\Facades\Prism;

Decision Workflow

When working with Prism, follow this pattern:

  1. Determine what you need:

    Text generation? → Use Prism::text() Structured JSON output? → Use Prism::structured() Embeddings? → Use Prism::embeddings() Image generation? → Use Prism::image() Audio (TTS/STT)? → Use Prism::audio()

  2. Always read the relevant docs first before implementing.

Related Packages