99 lines
3.0 KiB
Go
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
|
|
// }
|