Files
ollama/sample/structured_outputs.go
2025-01-29 10:28:22 -08:00

99 lines
3.0 KiB
Go

package sample
import "github.com/ollama/ollama/model"
type StructuredOutput struct {
schema *Schema
}
func BuildStructuredOutputGraph(schema *Schema, proc model.TextProcessor) *PDANode {
// _, stateToNodeMap, err := BuildGraph(proc)
// if err != nil {
// panic(err)
// }
return nil
}
// func constrainGraph(graph *PDANode, schema *Schema) *PDANode {
// // If no schema constraints, return original graph node
// if schema == nil {
// return graph
// }
// // Create a new node with same state
// constrainedNode := NewPDANode(graph.State)
// // Copy over existing transitions and masks
// constrainedNode.TransitionEdges = make(map[rune]*PDANode)
// for r, node := range graph.TransitionEdges {
// constrainedNode.TransitionEdges[r] = node
// }
// constrainedNode.MaskTokenIDToNode = graph.MaskTokenIDToNode
// // Apply schema constraints based on type
// switch schema.EffectiveType() {
// case "object":
// // Only allow defined property names in object keys
// if graph.State == StateInObjectKey {
// // TODO: Add property name validation
// }
// // Constrain property values based on schema
// if graph.State == StateInColon || graph.State == StateInSpace {
// // Clear transitions to only allow valid types
// constrainedNode.TransitionEdges = make(map[rune]*PDANode)
// // Add transitions based on property schemas
// for _, prop := range schema.Properties {
// switch prop.EffectiveType() {
// case "object":
// if objNode, ok := graph.TransitionEdges['{']; ok {
// constrainedNode.TransitionEdges['{'] = constrainGraph(objNode, prop)
// }
// case "array":
// if arrNode, ok := graph.TransitionEdges['[']; ok {
// constrainedNode.TransitionEdges['['] = constrainGraph(arrNode, prop)
// }
// case "string":
// if strNode, ok := graph.TransitionEdges['"']; ok {
// constrainedNode.TransitionEdges['"'] = constrainGraph(strNode, prop)
// }
// case "number":
// for _, r := range validNumberRunes {
// if numNode, ok := graph.TransitionEdges[r]; ok {
// constrainedNode.TransitionEdges[r] = constrainGraph(numNode, prop)
// }
// }
// case "integer":
// for _, r := range validIntRunes {
// if intNode, ok := graph.TransitionEdges[r]; ok {
// constrainedNode.TransitionEdges[r] = constrainGraph(intNode, prop)
// }
// }
// case "boolean":
// for _, r := range []rune{'t', 'f'} {
// if boolNode, ok := graph.TransitionEdges[r]; ok {
// constrainedNode.TransitionEdges[r] = constrainGraph(boolNode, prop)
// }
// }
// case "null":
// if nullNode, ok := graph.TransitionEdges['n']; ok {
// constrainedNode.TransitionEdges['n'] = constrainGraph(nullNode, prop)
// }
// }
// }
// }
// case "array":
// // Constrain array items based on schema
// if schema.Items != nil {
// for r, node := range graph.TransitionEdges {
// constrainedNode.TransitionEdges[r] = constrainGraph(node, schema.Items)
// }
// }
// }
// return constrainedNode
// }