This chapter provides detailed documentation of Odin framework's API interfaces and main class usage.
所有模型实现的基础接口。
namespace Hyperf\Odin\Contract\Model;
interface ModelInterface
{
/**
* 同步聊天接口
* @param array<MessageInterface> $messages 消息数组
* @param float $temperature 温度参数,控制随机性
* @param int $maxTokens 最大生成令牌数
* @param array $stop 停止词
* @param array $tools 可用工具
* @param float $frequencyPenalty 频率惩罚参数
* @param float $presencePenalty 存在惩罚参数
* @param array $businessParams 业务参数
* @return ChatCompletionResponse 聊天完成响应
*/
public function chat(
array $messages,
float $temperature = 0.9,
int $maxTokens = 0,
array $stop = [],
array $tools = [],
float $frequencyPenalty = 0.0,
float $presencePenalty = 0.0,
array $businessParams = [],
): ChatCompletionResponse;
/**
* 流式聊天接口
* @param array<MessageInterface> $messages 消息数组
* @param float $temperature 温度参数,控制随机性
* @param int $maxTokens 最大生成令牌数
* @param array $stop 停止词
* @param array $tools 可用工具
* @param float $frequencyPenalty 频率惩罚参数
* @param float $presencePenalty 存在惩罚参数
* @param array $businessParams 业务参数
* @return ChatCompletionStreamResponse 流式聊天完成响应
*/
public function chatStream(
array $messages,
float $temperature = 0.9,
int $maxTokens = 0,
array $stop = [],
array $tools = [],
float $frequencyPenalty = 0.0,
float $presencePenalty = 0.0,
array $businessParams = [],
): ChatCompletionStreamResponse;
/**
* 文本补全接口
* @param string $prompt 提示文本
* @param float $temperature 温度参数,控制随机性
* @param int $maxTokens 最大生成令牌数
* @param array $stop 停止词
* @param float $frequencyPenalty 频率惩罚参数
* @param float $presencePenalty 存在惩罚参数
* @param array $businessParams 业务参数
* @return TextCompletionResponse 文本补全响应
*/
public function completions(
string $prompt,
float $temperature = 0.9,
int $maxTokens = 0,
array $stop = [],
float $frequencyPenalty = 0.0,
float $presencePenalty = 0.0,
array $businessParams = [],
): TextCompletionResponse;
}$model = new AzureOpenAIModel(
'gpt-4o-global',
[
'api_key' => env('AZURE_OPENAI_4O_API_KEY'),
'api_base' => env('AZURE_OPENAI_4O_API_BASE'),
'api_version' => env('AZURE_OPENAI_4O_API_VERSION'),
'deployment_name' => env('AZURE_OPENAI_4O_DEPLOYMENT_NAME'),
],
new Logger(),
);
// 聊天示例
$response = $model->chat([
new SystemMessage('你是一个助手'),
new UserMessage('你好'),
], 0.7, 100);
echo $response->getFirstChoice()->getMessage()->getContent();
// 流式聊天示例
$streamResponse = $model->chatStream([
new SystemMessage('你是一个助手'),
new UserMessage('你好'),
]);
foreach ($streamResponse->getStreamIterator() as $choice) {
echo $choice->getMessage()->getContent();
}
// 文本补全示例
$completionResponse = $model->completions('完成下面的句子:人工智能将帮助人类', 0.7, 100);
echo $completionResponse->getFirstChoice()->getText();提供文本嵌入功能的接口。
namespace Hyperf\Odin\Contract\Model;
interface EmbeddingInterface
{
/**
* 生成单个文本的嵌入向量
* @param string $input 要嵌入的文本
* @return Embedding 嵌入结果
*/
public function embedding(string $input): Embedding;
/**
* 批量生成文本的嵌入向量
* @param array|string $input 要嵌入的文本或文本数组
* @param string|null $encoding_format 编码格式,默认为'float'
* @param string|null $user 用户标识
* @return EmbeddingResponse 嵌入响应
*/
public function embeddings(array|string $input, ?string $encoding_format = 'float', ?string $user = null): EmbeddingResponse;
/**
* 获取模型名称
* @return string 模型名称
*/
public function getModelName(): string;
/**
* 获取向量维度
* @return int 向量维度
*/
public function getVectorSize(): int;
}$model = new OpenAIModel('text-embedding-3-small', [
'api_key' => env('OPENAI_API_KEY'),
], new Logger());
// 单个文本嵌入
$embedding = $model->embedding('这是一段需要转换为向量的文本');
$vector = $embedding->getEmbeddings();
// 批量文本嵌入
$response = $model->embeddings([
'这是第一段文本',
'这是第二段文本'
]);
// 访问批量嵌入结果
foreach ($response->getData() as $embedding) {
$vector = $embedding->getEmbeddings();
// 处理向量...
}所有消息类型实现的基础接口。
namespace Hyperf\Odin\Contract\Message;
interface MessageInterface
{
/**
* 获取消息角色
* @return Role 消息角色
*/
public function getRole(): Role;
/**
* 获取消息内容
* @return string 消息内容
*/
public function getContent(): string;
/**
* 获取消息唯一标识
* @return string 唯一标识
*/
public function getIdentifier(): string;
/**
* 设置消息唯一标识
* @param string $identifier 唯一标识
* @return self 当前对象
*/
public function setIdentifier(string $identifier): self;
/**
* 获取业务参数
* @return array 业务参数
*/
public function getParams(): array;
/**
* 设置业务参数
* @param array $params 业务参数
*/
public function setParams(array $params): void;
/**
* 将消息转换为数组
* @return array 数组表示
*/
public function toArray(): array;
/**
* 从数组创建消息
* @param array $message 消息数组
* @return self 消息对象
*/
public static function fromArray(array $message): self;
}系统指令消息,用于设置模型的行为。
use Hyperf\Odin\Message\SystemMessage;
$systemMessage = new SystemMessage('你是一个友好的AI助手');用户输入消息,表示用户的问题或请求。
use Hyperf\Odin\Message\UserMessage;
$userMessage = new UserMessage('你好,请介绍一下自己');
// 带有图片的用户消息 (多模态)
$userMessage = new UserMessage('这张图片是什么?', [
[
'type' => 'image_url',
'image_url' => [
'url' => 'https://example.com/image.jpg'
]
]
]);助手回复消息,表示模型的回答。
use Hyperf\Odin\Message\AssistantMessage;
$assistantMessage = new AssistantMessage('你好!我是一个AI助手,很高兴为你服务。');工具调用结果消息,表示工具执行的结果。
use Hyperf\Odin\Message\ToolMessage;
$toolMessage = new ToolMessage(
'get_weather',
['city' => '北京', 'temperature' => '26°C', 'condition' => '晴天']
);工具定义类,用于定义工具的名称、描述、参数和执行器。
namespace Hyperf\Odin\Tool\Definition;
class ToolDefinition
{
/**
* 构造函数
* @param string $name 工具名称
* @param string $description 工具描述
* @param null|ToolParameters $parameters 工具参数
* @param callable|array $toolHandler 执行器函数
*/
public function __construct(
string $name,
string $description = '',
?ToolParameters $parameters = null,
array|callable|\Closure $toolHandler = [],
);
/**
* 将工具定义转换为数组
* @return array 数组表示
*/
public function toArray(): array;
/**
* 将工具定义转换为 JSON Schema 格式
* @return array JSON Schema
*/
public function toJsonSchema(): array;
/**
* 验证参数是否符合工具定义
* @param array $parameters 要验证的参数
* @return array 验证结果
*/
public function validateParameters(array $parameters): array;
/**
* 获取工具处理器
* @return array|callable|\Closure 工具处理器
*/
public function getToolHandler(): array|callable|\Closure;
/**
* 获取工具名称
* @return string 工具名称
*/
public function getName(): string;
/**
* 获取工具描述
* @return string 工具描述
*/
public function getDescription(): string;
/**
* 获取工具参数
* @return null|ToolParameters 工具参数
*/
public function getParameters(): ?ToolParameters;
}工具参数类,用于定义工具的参数结构。
namespace Hyperf\Odin\Tool\Definition;
class ToolParameters
{
/**
* 构造函数
* @param array $properties 参数属性列表
* @param string $type 参数类型,默认为 object
* @param null|string $title 标题
* @param null|string $description 描述
*/
public function __construct(
array $properties = [],
string $type = 'object',
?string $title = null,
?string $description = null
);
/**
* 将参数转换为数组
* @return array 数组表示
*/
public function toArray(): array;
/**
* 从数组创建参数集合
* @param array $parameters 参数数组
* @return self 参数集合
*/
public static function fromArray(array $parameters): self;
/**
* 获取参数类型
* @return string 参数类型
*/
public function getType(): string;
/**
* 获取参数属性列表
* @return array 参数属性列表
*/
public function getProperties(): array;
/**
* 添加参数属性
* @param ToolParameter $property 参数属性
* @return self 当前对象
*/
public function addProperty(ToolParameter $property): self;
/**
* 获取必需参数列表
* @return array 必需参数列表
*/
public function getRequired(): array;
}use Hyperf\Odin\Tool\Definition\ToolDefinition;
use Hyperf\Odin\Tool\Definition\ToolParameters;
// 使用JSON Schema格式创建工具参数
$parameters = ToolParameters::fromArray([
'type' => 'object',
'properties' => [
'city' => [
'type' => 'string',
'description' => '城市名称',
],
'date' => [
'type' => 'string',
'description' => '查询日期,格式为YYYY-MM-DD',
],
],
'required' => ['city'],
]);
// 创建工具定义
$weatherTool = new ToolDefinition(
name: 'get_weather',
description: '获取指定城市的天气信息',
parameters: $parameters,
toolHandler: function (array $args) {
$city = $args['city'] ?? '北京';
// 实际应用中可能会调用天气 API
return [
'temperature' => '26°C',
'condition' => '晴天',
'city' => $city,
'date' => $args['date'] ?? date('Y-m-d'),
];
}
);
// 参数验证
$params = ['city' => '上海'];
$validationResult = $weatherTool->validateParameters($params);
if ($validationResult['valid']) {
// 执行工具
$result = $weatherTool->getToolHandler()($params);
} else {
// 处理验证错误
$errors = $validationResult['errors'];
// ...
}记忆管理接口,用于管理对话上下文。
namespace Hyperf\Odin\Contract\Memory;
interface MemoryInterface
{
/**
* 添加消息到记忆
* @param MessageInterface $message 要添加的消息
* @return self 当前对象
*/
public function addMessage(MessageInterface $message): self;
/**
* 添加系统消息
* @param MessageInterface $message 系统消息
* @return self 当前对象
*/
public function addSystemMessage(MessageInterface $message): self;
/**
* 获取所有消息
* @return array<MessageInterface> 消息数组
*/
public function getMessages(): array;
/**
* 获取所有系统消息
* @return array<MessageInterface> 系统消息数组
*/
public function getSystemMessages(): array;
/**
* 获取经过策略处理后的所有消息
* @return array<MessageInterface> 处理后的消息数组
*/
public function getProcessedMessages(): array;
/**
* 清空所有消息
* @return self 当前对象
*/
public function clear(): self;
/**
* 设置记忆策略
* @param PolicyInterface $policy 记忆策略
* @return self 当前对象
*/
public function setPolicy(PolicyInterface $policy): self;
/**
* 获取当前记忆策略
* @return null|PolicyInterface 当前策略或null
*/
public function getPolicy(): ?PolicyInterface;
/**
* 应用当前设置的策略处理消息
* @return self 当前对象
*/
public function applyPolicy(): self;
}记忆策略接口,用于定义如何处理记忆中的消息。
namespace Hyperf\Odin\Contract\Memory;
interface PolicyInterface
{
/**
* 处理消息列表,返回经过策略处理后的消息列表
* @param array<MessageInterface> $messages 原始消息列表
* @return array<MessageInterface> 处理后的消息列表
*/
public function process(array $messages): array;
/**
* 配置策略参数
* @param array $options 配置选项
* @return self 当前对象
*/
public function configure(array $options): self;
}use Hyperf\Odin\Memory\MemoryManager;
use Hyperf\Odin\Memory\Policy\WindowPolicy;
use Hyperf\Odin\Message\UserMessage;
use Hyperf\Odin\Message\AssistantMessage;
// 创建记忆管理器
$memory = new MemoryManager();
// 设置窗口策略,只保留最新的5条消息
$memory->setPolicy(new WindowPolicy(5));
// 添加消息
$memory->addMessage(new UserMessage('你好'));
$memory->addMessage(new AssistantMessage('你好!有什么可以帮助你的吗?'));
// 获取所有经过策略处理的消息
$messages = $memory->getProcessedMessages();
// 清空记忆
$memory->clear();聊天完成响应类,表示模型的回复。
namespace Hyperf\Odin\Api\Response;
class ChatCompletionResponse extends AbstractResponse implements Stringable
{
/**
* 转换为字符串
* @return string 响应内容
*/
public function __toString(): string;
/**
* 获取响应ID
* @return string|null 响应ID
*/
public function getId(): ?string;
/**
* 获取对象类型
* @return string|null 对象类型
*/
public function getObject(): ?string;
/**
* 获取创建时间戳
* @return int|null 创建时间戳
*/
public function getCreated(): ?int;
/**
* 获取模型名称
* @return string|null 模型名称
*/
public function getModel(): ?string;
/**
* 获取第一个选择
* @return ChatCompletionChoice|null 第一个选择
*/
public function getFirstChoice(): ?ChatCompletionChoice;
/**
* 获取所有选择
* @return array|null 选择数组
*/
public function getChoices(): ?array;
/**
* 获取使用情况
* @return Usage|null 使用情况
*/
public function getUsage(): ?Usage;
}流式聊天完成响应类,用于流式输出。
namespace Hyperf\Odin\Api\Response;
class ChatCompletionStreamResponse extends AbstractResponse implements Stringable
{
/**
* 转换为字符串
* @return string 响应描述
*/
public function __toString(): string;
/**
* 获取流式迭代器
* @return \Generator 选择生成器
*/
public function getStreamIterator(): \Generator;
/**
* 获取响应ID
* @return string|null 响应ID
*/
public function getId(): ?string;
/**
* 获取对象类型
* @return string|null 对象类型
*/
public function getObject(): ?string;
/**
* 获取创建时间戳
* @return int|null 创建时间戳
*/
public function getCreated(): ?int;
/**
* 获取模型名称
* @return string|null 模型名称
*/
public function getModel(): ?string;
/**
* 获取所有选择
* @return array 选择数组
*/
public function getChoices(): array;
}文本补全响应类,表示文本补全结果。
namespace Hyperf\Odin\Api\Response;
class TextCompletionResponse extends AbstractResponse
{
/**
* 获取第一个选择
* @return TextCompletionChoice|null 第一个选择
*/
public function getFirstChoice(): ?TextCompletionChoice;
/**
* 获取请求是否成功
* @return bool 成功状态
*/
public function isSuccess(): bool;
/**
* 获取原始内容
* @return string|null 原始内容
*/
public function getContent(): ?string;
/**
* 获取响应ID
* @return string|null 响应ID
*/
public function getId(): ?string;
/**
* 获取对象类型
* @return string|null 对象类型
*/
public function getObject(): ?string;
/**
* 获取创建时间
* @return string|null 创建时间
*/
public function getCreated(): ?string;
/**
* 获取所有选择
* @return array|null 选择数组
*/
public function getChoices(): ?array;
/**
* 获取使用情况
* @return Usage|null 使用情况
*/
public function getUsage(): ?Usage;
}嵌入响应类,表示嵌入结果。
namespace Hyperf\Odin\Api\Response;
class EmbeddingResponse extends AbstractResponse
{
/**
* 获取响应对象类型
* @return string 对象类型
*/
public function getObject(): string;
/**
* 获取嵌入数据
* @return Embedding[] 嵌入数据数组
*/
public function getData(): array;
/**
* 获取模型名称
* @return string|null 模型名称
*/
public function getModel(): ?string;
/**
* 转换为数组
* @return array 数组表示
*/
public function toArray(): array;
}模型工厂类,用于创建模型实例。
namespace Hyperf\Odin\Factory;
class ModelFactory
{
/**
* 创建模型实例
* @param string $implementation 模型实现类
* @param string $modelName 模型名称/端点
* @param array $config 模型配置
* @param null|ModelOptions $modelOptions 模型选项
* @param null|ApiOptions $apiOptions API请求选项
* @param null|LoggerInterface $logger 日志记录器
* @return EmbeddingInterface|ModelInterface 模型实例
*/
public static function create(
string $implementation,
string $modelName,
array $config = [],
?ModelOptions $modelOptions = null,
?ApiOptions $apiOptions = null,
?LoggerInterface $logger = null
): EmbeddingInterface|ModelInterface;
}use Hyperf\Odin\Factory\ModelFactory;
use Hyperf\Odin\Model\AzureOpenAIModel;
use Hyperf\Odin\Model\ModelOptions;
use Hyperf\Odin\Api\RequestOptions\ApiOptions;
use Hyperf\Odin\Logger;
// 创建模型选项
$modelOptions = new ModelOptions();
$modelOptions->setChat(true)
->setFunctionCall(true)
->setMultiModal(true);
// 创建API选项
$apiOptions = new ApiOptions();
$apiOptions->setTimeoutOption('read', 180.0);
// 创建模型实例
$model = ModelFactory::create(
implementation: AzureOpenAIModel::class,
modelName: 'gpt-4o-global',
config: [
'api_key' => env('AZURE_OPENAI_4O_API_KEY'),
'api_base' => env('AZURE_OPENAI_4O_API_BASE'),
'api_version' => env('AZURE_OPENAI_4O_API_VERSION'),
'deployment_name' => env('AZURE_OPENAI_4O_DEPLOYMENT_NAME'),
],
modelOptions: $modelOptions,
apiOptions: $apiOptions,
logger: new Logger(),
);客户端工厂类,用于创建API客户端实例。
namespace Hyperf\Odin\Factory;
class ClientFactory
{
/**
* 创建OpenAI客户端
* @param array $config 配置参数
* @param null|ApiOptions $apiOptions API请求选项
* @param null|LoggerInterface $logger 日志记录器
* @return ClientInterface OpenAI客户端
*/
public static function createOpenAIClient(
array $config,
?ApiOptions $apiOptions = null,
?LoggerInterface $logger = null
): ClientInterface;
/**
* 创建Azure OpenAI客户端
* @param array $config 配置参数
* @param null|ApiOptions $apiOptions API请求选项
* @param null|LoggerInterface $logger 日志记录器
* @return ClientInterface Azure OpenAI客户端
*/
public static function createAzureOpenAIClient(
array $config,
?ApiOptions $apiOptions = null,
?LoggerInterface $logger = null
): ClientInterface;
/**
* 创建AWS Bedrock客户端
* @param array $config 配置参数
* @param null|ApiOptions $apiOptions API请求选项
* @param null|LoggerInterface $logger 日志记录器
* @return ClientInterface AWS Bedrock客户端
*/
public static function createAwsBedrockClient(
array $config,
?ApiOptions $apiOptions = null,
?LoggerInterface $logger = null
): ClientInterface;
/**
* 根据提供商类型创建客户端
* @param string $provider 提供商类型 (openai, azure_openai, aws_bedrock)
* @param array $config 配置参数
* @param null|ApiOptions $apiOptions API请求选项
* @param null|LoggerInterface $logger 日志记录器
* @return ClientInterface 客户端实例
*/
public static function createClient(
string $provider,
array $config,
?ApiOptions $apiOptions = null,
?LoggerInterface $logger = null
): ClientInterface;
}use Hyperf\Odin\Factory\ClientFactory;
use Hyperf\Odin\Api\RequestOptions\ApiOptions;
use Hyperf\Odin\Logger;
// 创建API选项
$apiOptions = new ApiOptions();
$apiOptions->setTimeoutOption('read', 180.0);
// 创建Azure OpenAI客户端
$client = ClientFactory::createAzureOpenAIClient(
config: [
'api_key' => env('AZURE_OPENAI_4O_API_KEY'),
'api_base' => env('AZURE_OPENAI_4O_API_BASE'),
'api_version' => env('AZURE_OPENAI_4O_API_VERSION'),
'deployment_name' => env('AZURE_OPENAI_4O_DEPLOYMENT_NAME'),
],
apiOptions: $apiOptions,
logger: new Logger()
);
// 使用工厂方法创建客户端
$client = ClientFactory::createClient(
provider: 'aws_bedrock',
config: [
'access_key' => env('AWS_ACCESS_KEY_ID'),
'secret_key' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_REGION', 'us-east-1'),
],
apiOptions: $apiOptions,
logger: new Logger()
);详细了解了 API 后,您可以: